就是普通的Dijkstra。不过这次是两个。
第一个让求最短路径(如果不唯一要求时间最短)->d[maxn],t[maxn],visit[maxn]选 p[maxn]存储父节点
第二个让求最快路径(如果不唯一要求点最少) ->t[maxn],node[maxn],visit[maxn]选 p[maxn]存储父节点
注意从1到2 数组t visit p要重置。
最后判断相等不相等,用vector存储路径直接一个==即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=510;
const int INF=9999999;
int start,endx;
int n,m;
struct node{
int length=INF;
int t=INF;
}g[maxn][maxn];
int d[maxn];//距离原点的距离
int t[maxn];//距离原点的时间
bool visit[maxn]={false};
int p[maxn];
int node[maxn];
//最短的,最短的最快的。
void dij(){
fill(d,d+maxn,INF);
fill(t,t+maxn,INF);
d[start]=0;
t[start]=0;
for(int i=0;i<n;i++) p[i]=i;
for(int i=0;i<n;i++){
int u=-1;int min=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&d[j]<min){
u=j;min=d[j];
}
}
if(u==endx) break;
visit[u]=true;
for(int v=0;v<n;v++){
if(visit[v]==false&&g[u][v].length!=INF){
if(d[v]>d[u]+g[u][v].length){
d[v]=d[u]+g[u][v].length;
t[v]=t[u]+g[u][v].t;
p[v]=u;
}else if(d[v]==d[u]+g[u][v].length&&t[v]>t[u]+g[u][v].t){
t[v]=t[u]+g[u][v].t;
p[v]=u;
}
}
}
}
}
//最快的 点最少的
void tij(){
fill(t,t+maxn,INF);
fill(visit,visit+maxn,false);
fill(node,node+maxn,INF);
t[start]=0;node[start]=0;
for(int i=0;i<n;i++) p[i]=i;
for(int i=0;i<n;i++){
int u=-1;int min=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&t[j]<min){
u=j;min=t[j];
}
}
if(u==-1) break;
visit[u]=true;
for(int v=0;v<n;v++){
if(visit[v]==false&&g[u][v].length!=INF){
if(t[v]>t[u]+g[u][v].t){
t[v]=t[u]+g[u][v].t;
p[v]=u;
node[v]=node[u]+1;
}
else if(t[v]==t[u]+g[u][v].t&&node[v]>node[u]+1){
p[v]=u;
node[v]=node[u]+1;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b,c,d,e;
cin>>a>>b>>c>>d>>e;
if(c==1){
g[a][b].length=d;g[a][b].t=e;
}else{//看错了原来0是双行道
g[b][a].length=d;g[b][a].t=e;
g[a][b].length=d;g[a][b].t=e;
}
}
cin>>start>>endx;
dij();
// cout<<"Distance = "<<d[endx]<<": ";
vector<int> distance,timex;
int temp=endx;//5
while(p[temp]!=temp){
distance.push_back(temp);
temp=p[temp];
}
// cout<<start;
// for(int i=distance.size()-1;i>=0;i--) cout<<" -> "<<distance[i];
tij();
// cout<<"Time = "<<t[endx]<<": ";
temp=endx;//5
while(p[temp]!=temp){
timex.push_back(temp);
temp=p[temp];
}
// cout<<start;
// for(int i=timex.size()-1;i>=0;i--) cout<<" -> "<<timex[i];
if(timex==distance){
cout<<"Distance = "<<d[endx]<<"; ";
cout<<"Time = "<<t[endx]<<": ";
cout<<start;
for(int i=timex.size()-1;i>=0;i--) cout<<" -> "<<timex[i];
}else{
cout<<"Distance = "<<d[endx]<<": "<<start;
for(int i=distance.size()-1;i>=0;i--) cout<<" -> "<<distance[i];
cout<<endl;
cout<<"Time = "<<t[endx]<<": "<<start;
for(int i=timex.size()-1;i>=0;i--) cout<<" -> "<<timex[i];
}
return 0;
}