这道题是增加了一个花费的数据。。不过也不是大问题。。
不过最大问题是、这题的最坑爹之处。默认的测试数据里包含两个城市间有多条路径的情况。啊啊啊。。
这TM的研究生复试上机考试,会坑死一群奋斗了一年的倒霉的孩纸额。。。
#include <iostream> using namespace std; const int INF=0x3f3f3f3f; const int MAXV=1005; struct vertex { int d; int p; }; vertex cost[MAXV][MAXV]; vertex operator+(const vertex&a,const vertex&b) { vertex c; c.d=a.d+b.d; c.p=a.p+b.p; return c; } void Dijkstra(int n,int v,int t) { vertex dist[MAXV]; bool s[MAXV]; for(int i=1;i<=n;i++) { dist[i]=cost[v][i]; s[i]=0; } s[v]=1; int k; for(int i=1;i<=n;i++) { int min=INF; for(int j=1;j<=n;j++) { if(s[j]==0&&dist[j].d<min) { k=j; min=dist[j].d; } } s[k]=1; for(int j=1;j<=n;j++) { if(s[j]==0) { if(cost[k][j].d<INF&&dist[k].d+cost[k][j].d<dist[j].d) dist[j]=dist[k]+cost[k][j]; else if(dist[k].d+cost[k][j].d==dist[j].d) if(dist[k].p+cost[k][j].p<dist[j].p) dist[j].p=dist[k].p+cost[k][j].p; } } } printf("%d %d ",dist[t].d,dist[t].p); } int main() { int n,m; while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cost[i][j].d=cost[i][j].p=INF; } } int a,b,d,p; while(m--) { scanf("%d%d%d%d",&a,&b,&d,&p); if(cost[a][b].d!=INF&&cost[a][b].d>d) { cost[a][b].d=cost[b][a].d=d; cost[a][b].p=cost[b][a].p=p; } else if(cost[a][b].d==INF) { cost[a][b].d=cost[b][a].d=d; cost[a][b].p=cost[b][a].p=p; } } int v,t; scanf("%d%d",&v,&t); Dijkstra(n,v,t); } return 0; }