很明显就是一道单源最短路题,再加两个辅助数组和路径数组。
#include <iostream>
#include <cstring>
#define N 510
using namespace std;
int h[N],tot;
int ne[N*N],ver[N*N],le[N*N],tm[N*N];//邻接边
int n,m,st,ed;
int timi[N],d[N],dist[N],c[N],v1[N],v2[N],p1[N],p2[N];//最快路及距离,最短路及节点数
void add(int u,int v,int l,int t){
ver[++tot]=v; le[tot]=l; tm[tot]=t;
ne[tot]=h[u]; h[u]=tot;
}
void dijk(){
memset(timi,0x3f,sizeof timi);
memset(dist,0x3f,sizeof dist);
memset(d,0x3f,sizeof d);
for(int i=h[st];i;i=ne[i]){
timi[ver[i]]=tm[i]; p1[ver[i]]=st; d[ver[i]]=le[i];//d为最快路的路径长度
dist[ver[i]]=le[i]; p2[ver[i]]=st; c[ver[i]]=2;//c为最短路的节点数
}
v1[st]=1; timi[st]=0; d[st]=0;
v2[st]=1; dist[st]=0; c[st]=1;
int flag1=0,flag2=0;
while(!flag1||!flag2){
int k1=-1,mint=1e9,k2=-1,mind=1e9;
for(int i=0;i<n;i++){
if(!v1[i]&&timi[i]<mint) mint=timi[i],k1=i;
if(!v2[i]&&dist[i]<mind) mind=dist[i],k2=i;
}
if(k1==ed) flag1=1;
if(k2==ed) flag2=1;
if(!flag1){
v1[k1]=1;
for(int i=h[k1];i;i=ne[i]){
if(!v1[ver[i]]){
if(timi[ver[i]]>timi[k1]+tm[i]){//时间变短
timi[ver[i]]=timi[k1]+tm[i];
d[ver[i]]=d[k1]+le[i];
p1[ver[i]]=k1;
}
else if(timi[ver[i]]==timi[k1]+tm[i]&&d[ver[i]]>d[k1]+le[i]){//时间相同,路径变短
d[ver[i]]=d[k1]+le[i];
p1[ver[i]]=k1;
}
}
}
}
if(!flag2){
v2[k2]=1;
for(int i=h[k2];i;i=ne[i]){
if(!v2[ver[i]]){
if(dist[ver[i]]>dist[k2]+le[i]){//路径变短
dist[ver[i]]=dist[k2]+le[i];
c[ver[i]]=c[k2]+1;
p2[ver[i]]=k2;
}
else if(dist[ver[i]]==dist[k2]+le[i]&&c[ver[i]]>c[k2]+1){//路径相同,节点数减少
c[ver[i]]=c[k2]+1;
p2[ver[i]]=k2;
}
}
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
int u,v,k,l,t;
while(m--){
scanf("%d%d%d%d%d",&u,&v,&k,&l,&t);
add(u,v,l,t);
if(!k) add(v,u,l,t);
}
scanf("%d%d",&st,&ed);
dijk();
int ans1[N],at1=0,ans2[N],at2=0,flag=1,e;//答案路径
ans1[++at1]=e=ed;
while(p1[e]!=st){
ans1[++at1]=p1[e];
e=p1[e];
}
ans2[++at2]=e=ed;
while(p2[e]!=st){
ans2[++at2]=p2[e];
e=p2[e];
}
if(at1!=at2) flag=0;
else{
for(int i=1;i<=at1;i++)
if(ans1[i]!=ans2[i]) {flag=0;break;}
}
if(flag){
printf("Time = %d; Distance = %d: %d",timi[ed],dist[ed],st);
for(int i=at1;i;i--) printf(" => %d",ans1[i]);
}
else{
printf("Time = %d: %d",timi[ed],st);
for(int i=at1;i;i--) printf(" => %d",ans1[i]);
puts("");
printf("Distance = %d: %d",dist[ed],st);
for(int i=at2;i;i--) printf(" => %d",ans2[i]);
}
return 0;
}