2143=图结构练习——最短路径

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define inf 0x3f3f3f
 4 int map[100][100];
 5 int min(int x,int y)
 6 {
 7     return x<y?x:y;
 8 }//用来比较大小;
 9 void floyd(int n)//也可以叫做插点法,简单的理解为在两个点内插入一个点来判断是直接到达还是间接达到快。
10 {
11     int i,j,k;
12     for(k=1; k<=n; k++)//k可以理解为插点。
13     {
14         for(i = 1; i <= n; i++)//i可以理解为起点。
15         {
16             for(j = 1; j <= n; j++)//j可以理解为终点。
17             {
18                 if(i!=j)
19                 {
20                     map[i][j]=min((map[i][k]+map[k][j]),map[i][j]);//选择哪个路径最短。
21                 }
22             }
23         }
24     }
25     printf("%d\n",map[1][n]);//最终结果是从1到n,所以输出map[1][n]。
26     return;
27 
28 }
29 int main()
30 {
31     int n,k;
32     while(scanf("%d %d",&k,&n)!=EOF)
33     {
34         int i,j;
35         int a,b,c;
36         memset(map,0,sizeof(map));//全部初始化为0;
37         for(i=1; i<=k; i++)
38         {
39             for(j=1; j<=k; j++)
40             {
41                 if(i!=j)map[i][j]=inf;//将路径初始化为无限大,表示无法通过。
42             }
43         }
44         for(i=0; i<n; i++)
45         {
46             scanf("%d %d %d",&a,&b,&c);
47             if(map[a][b]>c)map[a][b]=map[b][a]=c;//将路径赋予权值,表示可以通过。
48         }
49         floyd(k);
50     }
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/Angfe/p/10396809.html