这个题目是套用dijstra()模板,但又拐了一个弯,本题每条路径上都有两个权值,本题不必考虑花费,直接球最短路,只是在更新顶点值的时候有一个特殊处理,求得花费。
#include<stdio.h> #include<string.h> #include<stdlib.h> int n,m,s,t; int inf=0x7fffffff; int hash[1010],dis[1010],map[1010][1010],pay[1010][1010],des[1010]; void dijstra() { dis[s]=0; des[s]=0; for(int i=1;i<=n;i++) { int r=inf,pos; for(int j=1;j<=n;j++) { if(hash[j]==0) { if(dis[j]<r) { r=dis[j]; pos=j; } } } hash[pos]=1; if(pos==t) break; for(int j=1;j<=n;j++) { if(hash[j]==0) { if(map[pos][j]!=inf) { if(dis[pos]+map[pos][j]<dis[j]) { dis[j]=map[pos][j]+dis[pos]; des[j]=pay[pos][j]+des[pos]; } else if(map[pos][j]+dis[pos]==dis[j]) { if(pay[pos][j]+des[pos]<des[j]) { des[j]=pay[pos][j]+des[pos]; } } } } } } } int main() { int a,b; int d,p; while(scanf("%d%d",&n,&m),m||n) { for(int i=1;i<=n;i++) { dis[i]=inf; hash[i]=0; des[i]=inf; for(int j=1;j<=n;j++) { map[i][j]=inf; pay[i][j]=inf; } } for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(a!=b&&map[a][b]>=d) { map[a][b]=map[b][a]=d; pay[a][b]=pay[b][a]=p; } /*if(a!=b&&map[a][b]>=d) { map[a][b]=map[b][a]=d; } if(a!=b&&pay[a][b]>=p) { pay[a][b]=pay[b][a]=p; }*///此处为错误代码,刚开始因为写的是这个,结果一直wa,后来参考了别人的代码,将此处改了一下,结果AC了 。 } scanf("%d%d",&s,&t); dijstra(); printf("%d %d\n",dis[t],des[t]); } //system("pause"); return 0; }
编辑器加载中...