pat甲级1111
#include<iostream>
#include<vector>
using namespace std;
const int INF=99999999;
int main(){
int n,m;
cin>>n>>m;
int dis[n][n],tim[n][n],r1,r2,nu,d,t;//dis存放边长,tim存放时间
fill(dis[0],dis[0]+n*n,INF);
fill(tim[0],tim[0]+n*n,INF);
for(int i=0;i<m;i++){
cin>>r1>>r2>>nu>>d>>t;
dis[r1][r2]=d;
tim[r1][r2]=t;
if(nu==0){//如果单连通
dis[r2][r1]=d;
tim[r2][r1]=t;
}
}
cin>>r1>>r2;
vector<int> ve[n];//记录由r1到达每个点的路径
ve[r1].push_back(r1);
int distance[n],all_time[n];//记录由r1到达每个点的距离,时间
fill(distance,distance+n,INF);
fill(all_time,all_time+n,INF);
distance[r1]=0;
all_time[r1]=0;
bool vis[n]={false};//是否已经确定路径
for(int i=0;i<n;i++){//dijkstra算法
int minnum=INF,ans;
for(int j=0;j<n;j++){ //确定最短路径
if(!vis[j]&&distance[j]<minnum){
minnum=distance[j];
ans=j;
}
}
vis[ans]=true;
for(int j=0;j<n;j++){//路径刷新
vector<int> vee=ve[ans];
if(!vis[j]&&distance[ans]+dis[ans][j]<distance[j]){
distance[j]=distance[ans]+dis[ans][j];
all_time[j]=all_time[ans]+tim[ans][j];
vee.push_back(j);
ve[j]=vee;
vee.clear();
}
else if(!vis[j]&&distance[ans]+dis[ans][j]==distance[j]&&all_time[ans]+tim[ans][j]<all_time[j]){
distance[j]=distance[ans]+dis[ans][j];
all_time[j]=all_time[ans]+tim[ans][j];
vee.push_back(j);
ve[j]=vee;
vee.clear();
}
}
}
vector<int> ve2[n];//与上面原理相同,找出时间最短路径,如果时间相同通过节点数最少
ve2[r1].push_back(r1);
int total_time[n],section[n];
fill(total_time,total_time+n,INF);
fill(section,section,0);
total_time[r1]=0;
bool vis2[n]={false};
for(int i=0;i<n;i++){
int mintime=INF,ans;
for(int j=0;j<n;j++){
if(!vis2[j]&&total_time[j]<mintime){
mintime=total_time[j];
ans=j;
}
}
vis2[ans]=true;
for(int j=0;j<n;j++){
vector<int> vee2=ve2[ans];
int sectionnum=section[ans];
sectionnum++;
if(!vis2[j]&&total_time[ans]+tim[ans][j]<total_time[j]){
total_time[j]=total_time[ans]+tim[ans][j];
section[j]=sectionnum;
vee2.push_back(j);
ve2[j]=vee2;
vee2.clear();
}
else if(!vis2[j]&&total_time[ans]+tim[ans][j]==total_time[j]&§ionnum<section[j]){
total_time[j]=total_time[ans]+tim[ans][j];
section[j]=sectionnum;
vee2.push_back(j);
ve2[j]=vee2;
vee2.clear();
}
}
}
bool equal=true;//判断路径是否相同
if(ve[r2].size()!=ve2[r2].size())
equal=false;
else{
for(int i=0;i<ve[r2].size();i++){
if(ve[r2][i]!=ve2[r2][i]){
equal=false;
break;
}
}
}
if(!equal){
cout<<"Distance = "<<distance[r2]<<": ";
for(int i=0;i<ve[r2].size();i++){
cout<<ve[r2][i];
if(i!=ve[r2].size()-1)
cout<<" -> ";
}
cout<<endl;
cout<<"Time = "<<total_time[r2]<<": ";
for(int i=0;i<ve2[r2].size();i++){
cout<<ve2[r2][i];
if(i!=ve2[r2].size()-1)
cout<<" -> ";
}
cout<<endl;
}
else{
cout<<"Distance = "<<distance[r2]<<"; ";
cout<<"Time = "<<total_time[r2]<<": ";
for(int i=0;i<ve2[r2].size();i++){
cout<<ve2[r2][i];
if(i!=ve2[r2].size()-1)
cout<<" -> ";
}
cout<<endl;
}
return 0;
}