#include<iostream> using namespace std; const int maxx=105; const int INF=1000000; int map[maxx][maxx]; bool used[maxx]; int dis[maxx]; int mapsize; void init(int c) { int x,y,quan; for(x=0;x<maxx;x++) { used[x]=0; } for(x=0;x<maxx;x++) { dis[x]=INF; } for(x=0;x<maxx;x++) for(y=0;y<maxx;y++) { if(x==y) { map[x][y]=0; } else { map[x][y]=INF; } }//初始化完成; while(c--) { scanf("%d %d %d",&x,&y,&quan); map[x][y]=quan; map[y][x]=quan; } } void Dijkstra(int a,int b) { int i; int j; int k; for(i=1;i<=mapsize;i++) { dis[i]=map[a][i]; }//输入迪杰斯特拉 数组; for(i=1;i<=mapsize;i++) { int min=INF; int weizhi; for(j=1;j<=mapsize;j++)//搜索最小数值 { if(dis[j]<=min&&used[j]==0) { min=dis[j]; weizhi=j; } }//搜索最小数值 used[weizhi]=1; for(j=1;j<=mapsize;j++) { if(map[weizhi][j]+dis[weizhi]<dis[j]&&used[j]==0) { dis[j]=map[weizhi][j]+dis[weizhi]; } } } printf("%d ",dis[b]);//输出a 到 b最小值 } int main() { int star,end; int n,m; while(scanf("%d %d",&n,&m)!=EOF,n+m) { star=1; end=n; mapsize=n; init(m); Dijkstra(star,end); } return 0; }
要理解好迪杰斯塔拉;
每次更新都要加回 搜索到的最小值的 dis值;