最短路径问题 | 问题集合
写在前面
暂时码的是问题+代码,题解暂时不码,后续会补充几个最短路的算法分析(:暑假作业真的多
描述
天网恢恢,疏而不漏,经过上一次的抓捕,OI总部终于获取了怪盗的特征!现在,我们需要在基德再次来之前就把他的特征送到超级大牛的手上,可惜超级大牛不在总部.所以飞过海必须尽快把资料送到大牛家里.已知OI总部到大牛家中间有n-2个城城市,为了尽快达到目的地,飞过海通过水晶球(够先进吧)了解到OI总部到大牛家的路线图,图上显示了n个城之间的连接距离。
可是飞过海很忙,需要请你来帮忙写个程序.
格式
输入格式
第一行 n
第二行到第n+1 行
每行 n个数字
(第i+1行,表示 第i个城市与其他城市之间的连接关系 0 表示不连接 其他数字表示连接的距离 )
输出格式
第1行 n个用空格间隔的整数 表示所选的线路
第2行 一个数字 最短距离
样例输入1
7
0 3 5 0 0 0 0
0 0 0 7 8 6 0
0 0 0 0 4 5 0
0 0 0 0 0 0 4
0 0 0 0 0 0 7
0 0 0 0 0 0 6
0 0 0 0 0 0 0
样例输出1
1 2 4 7
14
限制
各个测试点1s
提示
n<=1000
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 const int MAX = 1000000000;
6 int dis[1005][1005];
7 int path[1005][1005];
8
9 int read()
10 {
11 int x = 0;
12 char c = getchar();
13 while(c < '0' || c > '9') c = getchar();
14 while(c >= '0' && c <= '9') x = x*10 + c-'0' , c = getchar();
15 return x;
16 }
17
18 int main()
19 {
20 int num;
21 scanf("%d", &num);
22 for(int i = 1; i <= num; i++)
23 for(int k = 1; k <= num; k++)
24 {
25 dis[i][k] = read();
26 if(dis[i][k] == 0)
27 dis[i][k] = MAX;
28 path[i][k] = k;
29 }
30 for(int k = 1; k <= num; k++)
31 for(int i = 1; i <= num; i++)
32 for(int j = 1; j <= num; j++)
33 if(dis[i][j] > dis[i][k] + dis[k][j])
34 {
35 dis[i][j] = dis[i][k] + dis[k][j];
36 path[i][j] = path[i][k];
37 }
38 int st = 1, en = num;
39 while(st != en)
40 {
41 printf("%d ", st);
42 st = path[st][en];
43 }
44 printf("%d\n", en);
45 printf("%d\n", dis[1][num]);
46 return 0;
47 }
工欲善其事 必先利其器