3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
2 -1
最短路的模板题目,分别贴下Dijkstra 和 Floyd算法。
Dijkstra:
#include <stdio.h> #include <string.h> #define INF 1<<30 int map[205][205]; int vis[205],dis[205]; int n; int s,t; void dijkstra() { int mark,min; int i,j; memset(vis,0,sizeof(vis)); vis[s]=1; for(i=0;i<n;i++) dis[i]=map[s][i]; for(i=0;i<n;i++) { min=INF; for(j=0;j<n;j++) { if(!vis[j] && dis[j]<min) { min=dis[j]; mark=j; } } vis[mark]=1; for(j=0;j<n;j++) { if(!vis[j] && dis[j]>dis[mark] + map[mark][j]) dis[j]=dis[mark] + map[mark][j]; } } } int main() { int m; int a,b,c; int i,j; while(~scanf("%d %d",&n,&m)) { for(i=0;i<=n;i++) for(j=0;j<=n;j++) map[i][j]= (i==j)? 0:INF; for(i=0;i<m;i++) { scanf("%d %d %d",&a,&b,&c); if(c<map[a][b]) map[a][b]=map[b][a]=c; } scanf("%d %d",&s,&t); dijkstra(); int min=INF; if(dis[t]==INF) printf("-1\n"); else printf("%d\n",dis[t]); } return 0; }
#include <stdio.h> #include <string.h> #define INF 10000000 int map[205][205]; int main() { int n,m; int a,b,c; int i,j,k; while(~scanf("%d %d",&n,&m)) { for(i=0;i<n;i++) for(j=0;j<n;j++) map[i][j]= i==j? 0:INF; for(i=1;i<=m;i++) { scanf("%d %d %d",&a,&b,&c); if(map[a][b]>c) map[a][b]=map[b][a]=c; } for(k=0;k<n;k++) { for(i=0;i<n;i++) { for(j=0;j<n;j++) if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } } scanf("%d %d",&a,&b); if(map[a][b]!=INF) printf("%d\n",map[a][b]); else printf("-1\n"); } return 0; }