1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<iostream> #include<algorithm> #include<queue> #include<string.h> using namespace std; const int INF=0x3f3f3f3f;//无限大 const int N=1005; int map[N][N];//地图 int dist[N];//最短距离 int n,m; void dijkstra(int start,int len,int g[][N],int dis[]) { int vis[len]; queue<int>q;//队列,存剩余的节点 for(int i=0;i<len;i++){ dis[i]=INF; vis[i]=false; } dis[start]=0; vis[start]=true; q.push(start); while(!q.empty()){ int MIN=INF; int mindex; int u=q.front();q.pop(); for(int i=0;i<n;++i){ if(map[u][i]!=INF&&vis[i]!=true){ int temp=map[u][i]+dis[u]; if(dis[i]>temp){ dis[i]=temp; } if(dis[i]<MIN){ mindex=i; MIN=dis[i]; } } } if(MIN==INF){ break; } q.push(mindex); vis[mindex]=true; } } int main(){ int s,t,a,b,c; while(scanf("%d%d%d%d",&n,&m,&s,&t)==4&&n&&m){ memset(map,0x7f,sizeof(map)); for(int i=0;i<m;++i){ scanf("%d %d %d",&a,&b,&c); a--; b--; map[a][b]=map[b][a]=min(map[a][b],c); } dijkstra(--s,n,map,dist); printf("%d\n",dist[--t]); } return 0; }
|