最短路径问题 | 问题集合

写在前面

暂时码的是问题+代码,题解暂时不码,后续会补充几个最短路的算法分析(:暑假作业真的多

 


 

 

描述

天网恢恢,疏而不漏,经过上一次的抓捕,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 }
城市连接

 

posted @ 2017-08-14 14:44  Yuns's  阅读(117)  评论(0编辑  收藏  举报