TZOJ1049:杰西的问题 (Floyd最短路)
描述
众所周知,杰西住在城里,但他每周必须来下沙两次。路太长了,他走不了。但他如此坚决,没有什么能阻止他的到来。更何况,杰西要坐很多辆公共汽车来,路长不一样。所以,杰西想:我可以走最短的路来节省时间吗?
现在,问题摆在你身上,你能帮他算出最短的长度吗?
这简单吗?去做就对了!
输入
输入有几个测试用例。每个案例的第一行有两个数字 n,m (1 <= n,m <= 200 )。n 表示有 n 个巴士站 1th,2th,....nth 。m 表示有 m 条道路。然后接下来的 m 行,每行有 3 个整数 a,b,c,这意味着 a 和 b 公交车站之间的长度是 c(0 < c < 2000)。
然后一行有两个整数s,t,表示起点和终点汽车站。
输出
对于给定的起点和终点公交车站,输出一条线路中 s 和 t 之间的最短长度。
如果道路不存在,则输出-1。
样例输入
3 3
1 2 3
1 3 10
2 3 11
1 3
3 1
2 3 1
1 2
样例输出
10
-1
#include<bits/stdc++.h> using namespace std; int inf = 1e9+10; int mapp[1001][1001]; int main() { int n,m; while(cin>>n>>m) { for(int i=1;i<=n;i++) //初始化 { for(int j=1;j<=n;j++) { if(i==j) mapp[i][j] = 0; else mapp[i][j] = inf; } } int a,b,c; for(int i=1;i<=m;i++) //读入边 { scanf("%d %d %d",&a,&b,&c); mapp[a][b] = mapp[b][a] = c; //将a,b两座城市联通 } for(int k=1;k<=n;k++) //Floyd核心算法 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(mapp[i][j]>mapp[i][k]+mapp[k][j]) mapp[i][j] = mapp[i][k] + mapp[k][j]; } int s,t; scanf("%d %d",&s,&t); printf("%d\n",mapp[s][t]==inf?-1:mapp[s][t]); } return 0; }