你来擒孟获(最短路)
2015-10-06 16:57
197 查看
题目描述
三国时期,南蛮王孟获叛乱,诸葛亮起兵平乱。
当深入南蛮之地时,遇当地人绘得地图,发现各地分别由各个寨主据守,若诸葛亮想兵分多路进军,尽快占领各个山寨(必须占领所有山寨),并且最终所有士兵都汇聚到孟获所在山寨,若给你一次穿越的机会,你用程序告诉诸葛亮最少需要多少天才能完成这个任务。假设军队足够多,各分队行军速度一样,且诸葛亮神机妙算,到达每个山寨即日可以攻克。
输入
首先是一个正整数T,接下来是T组测试数据,每组数据第一行是两个整数n,m(2=<n<=1000,1=<m<=10000),分别表示山寨数量和总边数,山寨编号0,1,2,3….n-1
接下来m行,每行三个整数i,j,k(0=<i,j<n,k<=10^4),分别表示山寨i和山寨j之间有一条路,在这条路上需要行军k天,接下来一行两个整数s,t(0<=s,t<=n-1),分别表示诸葛亮所在部队的起点和孟获山寨所在终点的编号
输出
对每组数据输出一个整数,表示诸葛亮的士兵占领所有山寨并汇聚到孟获所在山寨所需要的最少天数,每个输出独占一行
样例输入
2
5 6
0 1 2
1 2 2
3 1 2
4 0 3
3 2 3
3 4 1
4 3
5 5
1 0 1
1 2 3
1 3 3
4 2 2
3 4 1
4 2
样例输出
7
9
求出所有点到起点,终点最短路权值,然后相加取最大,dijkstra算法
三国时期,南蛮王孟获叛乱,诸葛亮起兵平乱。
当深入南蛮之地时,遇当地人绘得地图,发现各地分别由各个寨主据守,若诸葛亮想兵分多路进军,尽快占领各个山寨(必须占领所有山寨),并且最终所有士兵都汇聚到孟获所在山寨,若给你一次穿越的机会,你用程序告诉诸葛亮最少需要多少天才能完成这个任务。假设军队足够多,各分队行军速度一样,且诸葛亮神机妙算,到达每个山寨即日可以攻克。
输入
首先是一个正整数T,接下来是T组测试数据,每组数据第一行是两个整数n,m(2=<n<=1000,1=<m<=10000),分别表示山寨数量和总边数,山寨编号0,1,2,3….n-1
接下来m行,每行三个整数i,j,k(0=<i,j<n,k<=10^4),分别表示山寨i和山寨j之间有一条路,在这条路上需要行军k天,接下来一行两个整数s,t(0<=s,t<=n-1),分别表示诸葛亮所在部队的起点和孟获山寨所在终点的编号
输出
对每组数据输出一个整数,表示诸葛亮的士兵占领所有山寨并汇聚到孟获所在山寨所需要的最少天数,每个输出独占一行
样例输入
2
5 6
0 1 2
1 2 2
3 1 2
4 0 3
3 2 3
3 4 1
4 3
5 5
1 0 1
1 2 3
1 3 3
4 2 2
3 4 1
4 2
样例输出
7
9
求出所有点到起点,终点最短路权值,然后相加取最大,dijkstra算法
# include <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <cmath> using namespace std; #define INF 0x3f3f3f3f #define Max 1001 int cost[Max][Max]; int d[Max]; bool used[Max]; void dijkstra(int n,int s) { memset(d,INF,sizeof(d)); memset(used,false,sizeof(used)); d[s]=0; while(true) { int v=-1; for(int u=0;u<n;u++) if(!used[u]&&(v==-1||d[u]<d[v])) v=u; if(v==-1) break; used[v]=true; for(int u=0;u<n;u++) { d[u]=min(d[u],d[v]+cost[u][v]); } } } int main() { int T,m,n,k,i,j; int from,to,Cost,f,t; freopen("in.txt","r",stdin); cin>>T; while(T--) { memset(cost,INF,sizeof(cost)); cin>>n>>m; for(i=0;i<m;i++) { cin>>from>>to>>Cost; cost[from][to]=cost[to][from]=Cost; } cin>>f>>t; dijkstra(n,f); int Time[Max],tim=0; memset(Time,0,sizeof(Time)); for(i=0;i<n;i++) Time[i]=d[i]; dijkstra(n,t); for(i=0;i<n;i++) { Time[i]+=d[i]; tim=max(tim,Time[i]); } cout<<tim<<endl; } }
相关文章推荐
- C++中的函数模板&&类模板
- 测试用例
- 欢迎使用CSDN-markdown编辑器
- 日常训练赛(国庆)
- SharedPreferences存储数据
- CSS3学习笔记(1)—淡入的文字
- 结对编程项目
- 使用tomcat部署域名网站
- jQuery的选择器中的通配符[id^='code']
- 锐雯上单不给就送(矩阵快速幂)
- 20151006的NOIP模拟赛
- 堆和栈的区别(转过无数次的文章)
- hdu 5296 Annoying problem (LCA)
- Android中铃声总结【安卓源码解析一】
- AE实现空间分析
- HRESULT用法
- 沉浸式状态栏
- jquery判断checkbox是否选中及改变checkbox状态
- [Python进阶-7]文件和目录的IO操作,以及json序列化和反序列化
- 【计蒜客】难题题库 001 A+B+C问题