PAT甲级 1111. Online Map

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Mr0cheng/article/details/79506040
今日推荐