要求如果最短距离有多条路线,则输出花费最少的。
所以在dijkstra模板基础上,增加一个价值的数组,在路径相同时,比较价值。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #define inf 999999999 #define maxn 1005 using namespace std; int g[maxn][maxn],c[maxn][maxn]; int dist[maxn],val[maxn]; int vis[maxn]; int n,m; void dijkstra(int st){ int i,j,mindis,u; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++){ dist[i]=g[st][i]; val[i]=c[st][i]; } vis[st]=1; for(i=1;i<=n;i++){ mindis=inf; u=-1; for(j=1;j<=n;j++){ if(!vis[j]&&mindis>dist[j]){ mindis=dist[j]; u=j; } } if(u==-1)break; vis[u]=1; for(j=1;j<=n;j++){ if(!vis[j]&&dist[j]>dist[u]+g[u][j]){ dist[j]=dist[u]+g[u][j]; val[j]=val[u]+c[u][j]; } else if(!vis[j]&&dist[j]==dist[u]+g[u][j]){ if(val[j]>val[u]+c[u][j]){ val[j]=val[u]+c[u][j]; } } } } } int main(){ int i,j,t; while(scanf("%d%d",&n,&m)!=EOF){ if(!n&&!m)break; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i==j){g[i][j]=0;c[i][j]=0;} else {g[i][j]=inf;c[i][j]=inf;} } dist[i]=inf; val[i]=inf; } for(i=0;i<m;i++){ int a,b,x,y; scanf("%d%d%d%d",&a,&b,&x,&y); if(g[a][b]>x){ g[a][b]=g[b][a]=x; c[a][b]=c[b][a]=y; } else if(g[a][b]==y){//一开始没有写这个条件,wa了一发,在建立的时候也要比较的 if(c[a][b]>y){ c[a][b]=c[b][a]=y; } } } int u,v; scanf("%d%d",&u,&v); dijkstra(u); printf("%d %d\n",dist[v],val[v]); } return 0; }