刷题——Silver Cow Party POJ

来源:互联网 发布:有道英语翻译软件下载 编辑:程序博客网 时间:2024/05/16 20:27
/*
n个点,m条有向边,起点为x,问从其他点到x点,再从x点回去的最小路径的最大值
正向单源最短路,反向单源最短路
*/
#include <stdio.h>
#include <vector>
using namespace std;
#define MAX 1e9
#define min(a,b) a>b?b:a
struct node{int to,cost;};
vector<node>G[1005];
vector<node>rG[1005];
int d[1005];
int rd[1005];
bool use[1005];
bool ruse[1005];
int n,m,x;
void short_path(){
    for(int i=1;i<=n;i++){
        d[i]=MAX;
        use[i]=false;
        rd[i]=MAX;
        ruse[i]=false;
    }
    d[x]=0;
    rd[x]=0;
    while(true){
        int v=-1,sp=MAX,rv=-1,rsp=MAX;
        for(int i=1;i<=n;i++){
            if(!use[i]&&sp>d[i]){
                sp=d[i];
                v=i;
            }
            if(!ruse[i]&&rsp>rd[i]){
                rsp=rd[i];
                rv=i;
            }
        }
        if(v==-1&&rv==-1){
            break;
        }
        if(v!=-1){
            use[v]=true;
            for(int i=0;i<G[v].size();i++){
                node a=G[v][i];
                d[a.to]=min(d[a.to],d[v]+a.cost);
            }
        }
        if(rv!=-1){
            ruse[rv]=true;
            for(int i=0;i<rG[rv].size();i++){
                node a=rG[rv][i];
                rd[a.to]=min(rd[a.to],rd[rv]+a.cost);
            }
        }
    }
}
int main(){
    while(~scanf("%d %d %d",&n,&m,&x)){
        for(int i=1;i<=n;i++){
            G[i].clear();
            rG[i].clear();
        }
        int a,b,t;
        for(int i=0;i<m;i++){
            scanf("%d %d %d",&a,&b,&t);
            G[a].push_back(node{b,t});
            rG[b].push_back(node{a,t});
        }
        short_path();
        int max=0;
        for(int i=1;i<=n;i++){
            if((d[i]+rd[i])>max){
                max=d[i]+rd[i];
            }
        }
        printf("%d\n",max);
    }
    return 0;
}
原创粉丝点击