dijkstra算法,增加一个判断最短路径条件,即相同距离增加一个时间判断,相同时间增加一个计数cnt判断,只需编写一个dijkstra函数,传递参数即可,每确定一个最短路径,记录该点的上一个位置,最后输出时用栈输出
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <cstdio> #define INF 999999999 int n,m,d,s; int len[500][500],dist[500],dlast[500]; int tm[500][500],time[500],tlast[500]; bool visited[500]; void dijkstra(int mp1[][500],int mp2[][500],int d1[],int last[]){ //d1[]为第一个判断条件,last[]为上一步 int d2[500]; //d2[]为第二个判断条件 for(int i=0;i<n;i++) visited[i]=false; for(int i=0;i<n;i++){ d1[i]=mp1[s][i]; last[i]=s; d2[i]=mp2[s][i]; } visited[s]=true;d1[s]=0;d2[s]=0; int v=s; while(v!=d){ int min=INF; for(int i=0;i<n;i++) if(!visited[i] && d1[i]<min){ v=i; min=d1[i]; } visited[v]=true; for(int i=0;i<n;i++) if(!visited[i]){ if(d1[v]+mp1[v][i]<d1[i]){ d1[i]=d1[v]+mp1[v][i]; d2[i]=d2[v]+mp2[v][i]; last[i]=v; } else if(d1[v]+mp1[v][i]==d1[i] && d2[v]+mp2[v][i]<d2[i]){ d2[i]=d2[v]+mp2[v][i]; last[i]=v; } } } } void output(int *last){ int step[500],pos=0; for(int i=d;i!=s;i=last[i],pos++) step[pos]=i; for(int i=pos-1;i>=0;i--) printf(" -> %d",step[i]); printf("\n"); } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<n;j++) len[i][j]=tm[i][j]=INF; for(int i=0;i<m;i++){ int v1,v2,oneway; scanf("%d%d",&v1,&v2); scanf("%d%d%d",&oneway,&len[v1][v2],&tm[v1][v2]); if(!oneway){ len[v2][v1]=len[v1][v2]; tm[v2][v1]=tm[v1][v2]; } } scanf("%d%d",&s,&d); if(s==d) printf("Distance = 0; Time = 0: %d -> %d",s,d); dijkstra(len,tm,dist,dlast); int cnt[500][500]; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cnt[i][j]=1; dijkstra(tm,cnt,time,tlast); bool identical=true; for(int i=d;i!=s && identical;i=dlast[i]) if(dlast[i]!=tlast[i]){ identical=false; } if(identical){ printf("Distance = %d; Time = %d: %d",dist[d],time[d],s); output(dlast); } else{ printf("Distance = %d: %d",dist[d],s); output(dlast); printf("Time = %d: %d",time[d],s); output(tlast); } return 0; } |