3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
2 -1
这题会有同起点同终点但不同距离的数据,,我说我怎么老WA。。。我现在知道了原来 dijkstra 算法可以计算任意一个起点到任意一个终点的最短距离,,也就是说,如果把它写成一个函数的话,那么就可以调用它做多源路径的问题了。当然可以的话还是用 floyd 啦 ^_^
#include<stdio.h> #include<string.h> const int INF = 1000000000; int d[210],vis[210],w[210][210]; int main() { int n,m,i,j,k; while(~scanf("%d%d", &n,&m)) { memset(vis, 0, sizeof(vis)); memset(w, 0, sizeof(w)); int a,b,c,s,e; for(i=0; i<m; i++) { scanf("%d%d%d", &a,&b,&c); if(w[a][b] == 0) w[a][b] = w[b][a] = c; //可能有同起终点但距离不同的情况 else if(c < w[a][b]) w[a][b] = w[b][a] = c; //如果是同一条路,则距离值最小的那条路 } scanf("%d%d", &s,&e); for(i=0; i<n; i++) //d[i]代表从起点到i点的最短距离 d[i] = (i == s ? 0 : INF); //谁是起点就赋值为0,其余赋值为无穷 for(i=0; i<n; i++) { int mmin = INF; for(j=0; j<n; j++) if(!vis[j] && d[j] <= mmin) mmin = d[k=j]; vis[k] = 1; for(j=0; j<n; j++) if(!vis[j] && w[k][j] && d[k]+w[k][j] < d[j]) d[j] = d[k]+w[k][j]; } if(d[e] == INF) printf("-1\n"); else printf("%d\n", d[e]); } return 0; }