#include<cstdio> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn=510; const int INF=1000000000; int G[maxn][maxn],T[maxn][maxn]; //边权 int d[maxn],t[maxn],cross[maxn]; //最短距离,最快距离,最少路口 int preA[maxn],preB[maxn]; //路径 bool vis[maxn]; //访问标记 int st,des; //起始点,终点 int n,m; //结点数,边数 void Dijkastra_1(int s) //求最短距离 { memset(vis,false,sizeof(vis)); fill(d,d+n,INF); fill(t,t+n,INF); d[s]=0; //初始化 t[s]=0; for(int i=0;i<n;i++) { int u=-1,minDist=INF; for(int j=0;j<n;j++) { if(d[j]<minDist) { u=j; minDist=d[j]; } } if(u==-1) return; vis[u]=true; for(int v=0;v<n v="" if="" g="" u="" v="" inf="" vis="" v="" false="" if="" d="" v="">d[u]+G[u][v]) { d[v]=d[u]+G[u][v]; t[v]=t[u]+T[u][v]; preA[v]=u; } else if((d[u]+G[u][v]==d[v])&&t[v]>t[u]+T[u][v]) { t[v]=t[u]+T[u][v]; preA[v]=u; } } } } } void Dijkastra_2(int s) //求最短距离 { memset(vis,false,sizeof(vis)); fill(t,t+n,INF); fill(cross,cross+n,INF); d[s]=0; //初始化 t[s]=0; cross[0]=0; for(int i=0;i<n;i++) { int u=-1,minTime=INF; for(int j=0;j<n;j++) { if(t[j]<minTime) { u=j; minTime=t[j]; } } if(u==-1) return; vis[u]=true; for(int v=0;v<n v="" if="" t="" u="" v="" inf="" vis="" v="" false="" if="" t="" v="">t[u]+T[u][v]) { t[v]=t[u]+T[u][v]; cross[v]=cross[u]+1; preB[v]=u; } else if((t[v]==t[u]+T[u][v])&&cross[v]>cross[u]+1) { cross[v]=cross[u]+1; preB[v]=u; } } } } } int main() { fill(G[0],G[0]+maxn*maxn,INF); fill(T[0],T[0]+maxn*maxn,INF); scanf("%d%d",&n,&m); int v1,v2,oneWay,length,time; for(int i=0;i<m;i++) { scanf("%d%d%d%d%d",&v1,&v2,&oneWay,&length,&time); G[v1][v2]=length; T[v1][v2]=time; if(oneWay==0) { G[v2][v1]=length; T[v2][v1]=time; } } scanf("%d%d",&st,&des); Dijkastra_1(st); //更新最短距离 Dijkastra_2(st); //更新最快距离 vector<int> path_1; vector<int> path_2; for(int i=des;i!=st;i=preA[i]) { path_1.push_back(i); } path_1.push_back(st); for(int j=des;j!=st;j=preB[j]) { path_2.push_back(j); } path_2.push_back(st); if(path_1!=path_2) { printf("Distance = %d: ",d[des]); for(int i=path_1.size()-1;i>=0;i--) { printf("%d",path_1[i]); if(i>0) printf("->"); //注意格式 else printf("\n"); } printf("Time = %d: ",t[des]); for(int i=path_2.size()-1;i>=0;i--) { printf("%d",path_2[i]); if(i>0) printf(" -> "); else printf("\n"); } } else { printf("Distance = %d; ",d[des]); printf("Time = %d: ",t[des]); for(int i=path_1.size()-1;i>=0;i--) { printf("%d",path_1[i]); if(i>0) printf(" -> "); //注意格式 else printf("\n"); } } } </int></int></n></n></algorithm></cstring></vector></cstdio>