#include<stdio.h> #include<iostream> using namespace std; const int maxn=1010; const int INF=1000000000; int n,m,c1,c2; int G[maxn][maxn],d[maxn]; int cost[maxn][maxn],c[maxn]; int vis[maxn]; int pre[maxn]; void dijkstra(int s){ fill(d,d+maxn,INF); fill(c,c+maxn,0); for(int i=0;i<maxn;i++){ pre[i]=i; } d[s]=0; c[s]=0; for(int i=0;i<n;i++){ int u=-1,min=INF; for(int j=0;j<n;j++){ if(vis[j]==0&&d[j]<min){ u=j; min=d[j]; } } if(u==-1)return; vis[u]=1; for(int v=0;v<n;v++){ if(vis[v]==0&&G[u][v]!=INF){ if(d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; c[v]=c[u]+cost[u][v]; pre[v]=u; } else if(d[u]+G[u][v]==d[v]&&c[v]>c[u]+cost[u][v]){ pre[v]=u; c[v]=c[u]+cost[u][v]; } } } } } void DFS(int s,int v){ if(v==s){ printf("%d ",s); return; } DFS(s,pre[v]); printf("%d ",v); } int main() { scanf("%d %d %d %d",&n,&m,&c1,&c2); int a0,b0,c0,d0; fill(G[0],G[0]+maxn*maxn,INF); //又忘初始化了 for(int i=0;i<m;i++){ scanf("%d %d %d %d",&a0,&b0,&c0,&d0); G[a0][b0]=c0; cost[a0][b0]=d0; G[b0][a0]=c0; cost[b0][a0]=d0; } dijkstra(c1); DFS(c1,c2); printf("%d %d",d[c2],c[c2]); return 0; }
原文:https://www.cnblogs.com/1012wenquan66/p/13660377.html