http://acm.hdu.edu.cn/showproblem.php?pid=1874
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> #include<math.h> #include<string.h> #include<ctype.h> #include<stdlib.h> #include <iostream> #include<algorithm> #include<queue> #define maxn 400 #define oo 0x3f3f3f3f using namespace std; int maps[maxn][maxn], dist[maxn],v[maxn]; int n, m; void Init() { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i==j) maps[i][j]=0; else maps[i][j]=maps[j][i]=oo; } } } void Dij(int x, int y) { memset(v, 0, sizeof(v)); for(int i=0; i<n; i++) dist[i]=maps[x][i]; v[x] = 1; for(int i=1; i<n; i++) { int index=-1, mins=oo; for(int j=0; j<n; j++) { if(!v[j] && dist[j]<mins) { index = j; mins = dist[j]; } } v[index] = 1; for(int j=0; j<n; j++) { if(!v[j] && dist[j]>maps[index][j]+mins) dist[j] = maps[index][j]+mins; } } if(dist[y]==oo) printf("-1\n"); else printf("%d\n", dist[y]); } int main() { int a, b, c, start, ends; while(scanf("%d %d", &n, &m)!=EOF) { Init(); for(int i=1; i<=m; i++) { scanf("%d %d %d", &a, &b, &c); maps[a][b]=maps[b][a]=min(maps[a][b], c); } scanf("%d %d", &start, &ends); Dij(start, ends); } return 0; }