版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr0cheng/article/details/79506040
Dijkstra算法,主要记住Dijkstra的visited数组,以及最大值变量的设置,即inf,不要用自带的INT_MAX,可能会溢出。
//visited INT_MAX
#include<bits/stdc++.h>
using namespace std;
const int maxn=500+10;
#define inf 0x77777777
vector<int> ansShortestPath,shortestPath,ansFastestPath,fastestPath;
bool visited[maxn];
int n,m;
struct node1{
int length,time;
}edge[maxn][maxn],father[maxn];
struct node2{
int length,time,cnt;
}dist[maxn];
int dijkstraTime(int s,int e){
for(int i=0;i<n;++i){
dist[i].length=dist[i].cnt=dist[i].time=0;
visited[i]=false;
}
visited[s]=true;
for(int i=0;i<n;++i){
if(edge[s][i].time!=0){
dist[i].time = edge[s][i].time;
++dist[i].cnt;
father[i].time = s;
}else{
dist[i].time = inf;
}
}
int cur,time;
for(int i=0;i<n-1;++i){
time=inf;
for(int j=0;j<n;++j){
if(time > dist[j].time && !visited[j]){
cur = j;
time =dist[j].time;
}
}
if(time==inf)break;
visited[cur]=true;
for(int j=0;j<n;++j){
if(edge[cur][j].time!=0){
if( dist[j].time > edge[cur][j].time + time ){
dist[j].time = edge[cur][j].time + time;
dist[j].cnt = 1 + dist[cur].cnt;
father[j].time = cur;
}else if( dist[j].time == edge[cur][j].time + time){
if(dist[j].cnt > 1 + dist[cur].cnt){//
dist[j].cnt = 1 + dist[cur].cnt;
father[j].time = cur;
}
}
}
}
}
return dist[e].time;
}
int dijkstraLength(int s,int e){
for(int i=0;i<n;++i){
dist[i].length=dist[i].cnt=dist[i].time=0;
visited[i]=false;
}
for(int i=0;i<n;++i){
if(edge[s][i].length!=0){
dist[i].length = edge[s][i].length;
dist[i].time = edge[s][i].time;
father[i].length =s;
}else{
dist[i].length = inf;
}
}
int cur,length;
for(int i=0;i<n-1;++i){
length=inf;
for(int j=0;j<n;++j){
if(length > dist[j].length && !visited[j]){
cur = j;
length =dist[j].length;
}
}
if(length==inf)break;
visited[cur]=true;
for(int j=0;j<n;++j){
if(edge[cur][j].length!=0){
if( dist[j].length > edge[cur][j].length + length ){
dist[j].length = edge[cur][j].length + length;
dist[j].time = edge[cur][j].time + dist[cur].time;
father[j].length = cur;
}else if( dist[j].length == edge[cur][j].length + length){
if(dist[j].time > edge[cur][j].time + dist[cur].time ){
dist[j].time = edge[cur][j].time + dist[cur].time;
father[j].length = cur;
}
}
}
}
}
return dist[e].length;
}
bool checkSame(int s,int e){
while(e!=s){
if(father[e].length!=father[e].time)return false;
e = father[e].length;
}
return true;
}
void outputLength(int s,int e){
if(s==e){
printf(" %d",s);
return;
}
outputLength(s,father[e].length);
printf(" -> %d",e);
}
void outputTime(int s,int e){
if(s==e){
printf(" %d",s);
return;
}
outputTime(s,father[e].time);
printf(" -> %d",e);
}
int main(){
scanf("%d %d",&n,&m);
int u,v,one_way,length,time;
for(int i=0;i<m;++i){
scanf("%d %d %d %d %d",&u,&v,&one_way,&length,&time);
edge[u][v].length=length;
edge[u][v].time=time;
if(one_way==0){
edge[v][u].length=length;
edge[v][u].time=time;
}
}
int s,e;
scanf("%d %d",&s,&e);
int shortest = dijkstraLength(s,e);
int fastest = dijkstraTime(s,e);
if(checkSame(s,e)){
printf("Distance = %d; Time = %d:",shortest,fastest);
outputTime(s,e);
}else{
printf("Distance = %d:",shortest);
outputLength(s,e);
printf("\n");
printf("Time = %d:",fastest);
outputTime(s,e);
}
return 0;
}