【动态规划 floyd】SPOJ ACPC13
为什么rzz会把这题放在NOI模拟赛的T2?
题目大意
有一张$n$个点$m$条边的有向图,每条边有权值$w_i$。
定义一个任务$(a_i,b_i,c_i)$是如下一条路径:
- 最多经过$c_i$条边
- 路径上的边权$w_i$依次递增
要求回答$q$个独立询问的任务最小值。
$? \le 150,?? \le ? \le 5000,? \le 1000,?_i \le 5000$
题目分析
一道NOIP题吧
首先会想到一种dp:$f_{i,j,k}$表示对于当前处理的点$p$,路径另一端是$i$,已经过$j$条边,上一条边的权值是$k$的最小代价,时间复杂度$O(qn^2m)$。
注意到这个状态里的“上一条边权值为k”看上去很浪费,自然考虑如何去掉“w_i依次递增”的限制条件。
接下去的操作应该比较套路:$f_{i,j,k}$表示从$i$到$j$的递增路径上经过了$k$条边,然后将边从小到大加入图中,对于当前边$(u,v,w)$,就类floyd地枚举一个起始点$i$转移到$f_{i,v,k+1}$,这样就能保证路径边权是依次递增的。
时间复杂度$O(m \log m+n^2m+q)$.
1 #include<bits/stdc++.h> 2 const int maxn = 153; 3 const int maxm = 5035; 4 const int INF = 0x3f3f3f3f; 5 6 struct Edge 7 { 8 int u,v,d; 9 bool operator < (Edge a) const 10 { 11 return d < a.d; 12 } 13 }edges[maxm]; 14 int T,n,m,q,f[maxn][maxn][maxn]; 15 16 int main() 17 { 18 for (scanf("%d",&T); T; --T) 19 { 20 memset(f, 0x3f3f3f3f, sizeof f); 21 scanf("%d%d%d",&n,&m,&q); 22 for (int i=1; i<=m; i++) 23 scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].d); 24 std::sort(edges+1, edges+m+1); 25 for (int i=1; i<=n; i++) f[i][i][0] = 0; 26 for (int t=1; t<=m; t++) 27 { 28 int u = edges[t].u, v = edges[t].v; 29 for (int i=1; i<=n; i++) 30 for (int j=0; j<=n; j++) 31 if (f[i][u][j]!=INF&&f[i][v][j+1] > f[i][u][j]+edges[t].d) 32 f[i][v][j+1] = f[i][u][j]+edges[t].d; 33 } 34 for (int i=1; i<=n; i++) 35 for (int j=1; j<=n; j++) 36 for (int l=1; l<=n; l++) 37 f[i][j][l] = std::min(f[i][j][l], f[i][j][l-1]); 38 for (int u,v,c; q; --q) 39 { 40 scanf("%d%d%d",&u,&v,&c), c = std::min(c, n); 41 printf("%d\n",f[u][v][c]!=INF?f[u][v][c]:-1); 42 } 43 } 44 return 0; 45 }
END
转载于:https://www.cnblogs.com/antiquality/p/10746264.html
【动态规划 floyd】SPOJ ACPC13相关推荐
- 动态规划 - Floyd算法求最短路径 - (Matlab建模)
Floyd算法又称为弗洛伊德算法.插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算 ...
- 动态规划-Floyd Warshall(佛洛依德) algorithm
一.Floyd算法简介 Floyd(弗洛伊德)算法相对于Dijkstra算法来说,可以解决多源最短路径问题(即可以从任意一个点到任意一个点),可应用于地图导航走最短路径.为各城市修建最短路径的通信网( ...
- SPOJ ACPC13——Increasing Shortest Path
题目传送们 题目梗概 给出一个有mm条边(有边权)nn个点的有向图. 给出QQ个询问ai,bi,ciai,bi,ci,询问aiai到bibi边数不超过cici的路径和的最小值,且要求该路径上的边权递增 ...
- prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」
欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...
- C++后端开发知识点总结
C++后端开发知识点总结 C++后端开发知识点总结 C++ 1. 全局变量的作用域与初始化 2. 字节对齐的计算方法 3. 类的静态成员 4. 纯虚函数的用法 5. 构造函数和析构函数的执行顺序 6. ...
- 2019最新Android算法相关面试大全,请查收
本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 本文讲解 Hash值是如何生成 谈谈HashMap的原理 最小生成树算法 最短路径算法 KMP算法 查找算法 排序算法 跳跃 ...
- Floyd算法的动态规划本质
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
- floyd算法和动态规划
楔子 long long ago就已经知道了Floyd算法,关键代码就4行,也容易记住,上上周又看到了Floyd,都说是动态规划,所以特意去学了一圈动态规划,今天终于又回到了它 状态方程: d[k][ ...
- 探求Floyd算法的动态规划本质
Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...
最新文章
- [memcached] 2. 高级应用
- Ubuntu 安装SVN服务器端
- WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
- NULL和INITIAL的区别 and database interface
- 【转】【C#.NET】ASP.NET状态管理之一:Cookie
- HTTP|Qt实践-Qt编写某平台刷评论软件(含代码与思路)
- PCL综述—三维图像处理
- Python编程基础21:GUI编程
- 普林斯顿微积分读本篇十二:洛必达法则
- diy计算机工作站,DIY 篇一:TU100组装移动工作站
- python中itertools模块zip_longest函数详解
- FPGA:ov7725摄像头通过VGA/HDMI显示RGB565格式的图像
- Win8.1 取消开机密码
- SQL*Loader-704: 内部错误: ulconnect: OCIServerAttach [0] SQL*Loader-704: Internal error ulconnect: OCI
- Navicat自动备份数据库
- linux+cs1.6服务器搭建,Linux玩CS反恐精英的方法
- JS实现水波涟漪特效
- 幼儿英语课前热身小游戏
- dsp2812 pmsm foc之速度环电流环
- 高职信息安全比赛攻防思路_2016广东省“中星杯”网络信息安全攻防大赛决赛回顾(2.0多图版)...