https://www.patest.cn/contests/pat-a-practise/1111
/*
没错,最快路径相同时是输出最少节点,自己读错题了
!!用pre[v].clear()一定先声明是二维数组;
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int inf=999999999;
int minnode=inf;
int dis[510],time[510],weight[510],e[510][510],w[510][510],dispre[510];
bool visit[510];
int st,en;
vector<int > dispath,timepath,path,temppath,timepre[510];
void dfsdis(int v){
dispath.push_back(v);
if(v==st)
return;
dfsdis(dispre[v]);
}
void dfstime(int v){
if(v==st){
temppath.push_back(v);
if(temppath.size()<minnode){
minnode=temppath.size();
timepath=temppath;
}
temppath.pop_back();
return ;
}
temppath.push_back(v);
for(int i=0;i<timepre[v].size();i++)
dfstime(timepre[v][i]);
temppath.pop_back();
}
int main(){
int n,m;
fill(dis,dis+510,inf);
fill(e[0],e[0]+510*510,inf);
fill(w[0],w[0]+510*510,inf);
fill(weight,weight+510,inf);
fill(time,time+510,inf);
int v1,v2,flg,len,t;
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>v1>>v2>>flg>>len>>t;
e[v1][v2]=len;
w[v1][v2]=t;
if(flg!=1){
e[v2][v1]=len;
w[v2][v1]=t;
}
}
cin>>st>>en;
dis[st]=0;
weight[st]=0;
for(int i=0;i<n;i++){
int u=-1,dismin=inf;
for(int j=0;j<n;j++){
if(visit[j]==false&&dis[j]<dismin){
u=j;
dismin=dis[j];
}
}
if(u==-1)
break;
visit[u]=true;
for(int v=0;v<n;v++){
if(visit[v]==false&&e[u][v]!=inf){
if(dis[v]>e[u][v]+dis[u]){
dis[v]=e[u][v]+dis[u];
dispre[v]=u;
weight[v]=weight[u]+w[u][v];
}
else if(dis[v]==e[u][v]+dis[u]&&weight[v]>weight[u]+w[u][v]){
weight[v]=weight[u]+w[u][v];
dispre[v]=u;
}
}
}
}
dfsdis(en);
fill(visit,visit+510,false);
time[st]=0;
//timepre[st].push_back(st);
for(int i=0;i<n;i++){
int u=-1,minn=inf;
for(int j=0;j<n;j++){
if(visit[j]==false&&time[j]<minn){
u=j;
minn=time[j];
}
}
if(u==-1)
break;
visit[u]=true;
for(int v=0;v<n;v++){
if(visit[v]==false&&w[u][v]!=inf){
if(time[v]>w[u][v]+time[u]){
time[v]=w[u][v]+time[u];
timepre[v].clear();
timepre[v].push_back(u);
}
else if(time[v]==w[u][v]+time[u]){
timepre[v].push_back(u);
}
}
}
}
dfstime(en);
printf("Distance = %d", dis[en]);
if(dispath == timepath) {
printf("; Time = %d: ", time[en]);
} else {
printf(": ");
for(int i = dispath.size() - 1; i >= 0; i--) {
printf("%d", dispath[i]);
if(i != 0) printf(" -> ");
}
printf("\n");
printf("Time = %d: ", time[en]);
}
for(int i = timepath.size() - 1; i >= 0; i--) {
printf("%d", timepath[i]);
if(i != 0) printf(" -> ");
}
return 0;
}