题意就是求S->T的最短路径,需要注意的是,这题会有重复输入的边,
比如:先输入 1 2 3 又输入 1 2 4,那么1和2之间最短的路径应该是3而不是后面输入的4
#include <iostream> #include <algorithm> #define N 220 #define INF 0x3f3f3f3f using namespace std; int map[N][N],n,m; int dijkstra(int s,int d) { int i,j,vis[N]= {0},dis[N]; for(i=0; i<N; i++) dis[i]=INF; for(i=0; i<n; i++) dis[i]=map[s][i]; vis[s]=1; for(i=1; i<n; i++) { int k=-1,min=INF; for(j=0; j<n; j++) if(!vis[j]&&dis[j]<min) { min=dis[j]; k=j; } if(k==-1) continue; vis[k]=1; for(j=0; j<n; j++) if(!vis[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } if(dis[d]==INF) return -1;/*不可达*/ return dis[d]; } int main() { int i; while(cin>>n>>m) { for(i=0; i<=n; i++) for(int j=0; j<=n; j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } for(i=0; i<m; i++) { int x,y,z; cin>>x>>y>>z; if(map[x][y]!=INF)/*判断是否重复输入*/ z=z<map[x][y]?z:map[x][y]; map[x][y]=map[y][x]=z; } int s,d; cin>>s>>d; cout<<dijkstra(s,d)<<endl; } return 0; }