从书上大体看了看思想 然后照着模板打 由于没考虑重边的问题WA一次
Dijkstra算法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<string.h> 3 int w[101][101]; 4 #define INF 0x3f3f3f3f 5 int main() 6 { 7 int i, j, k,n,m,d[5000],f[101],x,y,e; 8 while(scanf("%d%d", &n, &m)!=EOF) 9 { 10 memset(f, 0, sizeof(f)); 11 memset(w,INF,sizeof(w)); 12 d[1] = 0; 13 for(i = 2 ; i <= n ; i++) 14 d[i] = INF; 15 for(i = 1 ; i <= m ; i++) 16 { 17 scanf("%d%d%d", &x,&y,&e); 18 if(w[x][y]>e) 19 { 20 w[x][y] = e; 21 w[y][x] = e; 22 } 23 } 24 for(i = 1 ; i <= n ; i++) 25 { 26 int min = INF; 27 for(j = 1 ; j <= n ; j++) 28 if(!f[j]&&min>=d[j]) 29 min = d[k=j]; 30 f[k] = 1; 31 for(j = 1 ; j <= n ; j++) 32 if(d[j]>d[k]+w[k][j]) 33 d[j]=d[k]+w[k][j]; 34 } 35 printf("%d\n",d[n]); 36 } 37 return 0; 38 }
Floyd算法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #define INF 0x3f3f3f3f 4 int main() 5 { 6 int i, j, k, n, m, d[101][101],x,y,e; 7 while(scanf("%d%d", &n,&m)!=EOF) 8 { 9 memset(d,INF,sizeof(d)); 10 for(i = 1 ;i <= n ;i++) 11 d[i][i] = 0; 12 for(i = 1 ; i <= m ; i++) 13 { 14 scanf("%d%d%d", &x,&y,&e); 15 if(d[x][y]>e) 16 { 17 d[x][y] = e; 18 d[y][x] = e; 19 } 20 } 21 for(k =1 ;k<=n ;k++) 22 for(i = 1 ;i <= n ; i++) 23 for(j = 1 ;j <= n ; j++) 24 if(d[i][j]>d[i][k]+d[k][j]) 25 d[i][j] = d[i][k]+d[k][j]; 26 printf("%d\n",d[1][n]); 27 } 28 return 0; 29 }