题目链接:

http://poj.org/problem?id=3268

 

题意:

先求出所有牛到x的最短路,再求出x到所有牛的最短路,两者相加取最大值(单向图)(可以用迪杰斯特拉,SPFA)

 

迪杰斯特拉:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
using namespace std;

#define N 1005
#define INF 0xfffffff

int n, m, x;
int a, b, t;
int G[N][N], dist1[N], dist2[N];
bool vis1[N], vis2[N];

void IN()
{
    memset(vis1, false, sizeof(vis1));
    memset(vis2, false, sizeof(vis2));
    for(int i=1; i<=n; i++)
    {
        dist1[i]=INF;
        dist2[i]=INF;
        for(int j=1; j<=i; j++)
            G[i][j]=G[j][i]=INF;
    }
}

void DIJ1()
{
    dist1[x]=0;
    for(int i=1; i<=n; i++)
    {
        int index=1, MIN=INF;
        for(int j=1; j<=n; j++)
        {
            if(!vis1[j] && dist1[j]<MIN)
            {
                index=j, MIN=dist1[j];
            }
        }
        vis1[index]=1;
        for(int j=1; j<=n; j++)
        {
          dist1[j]=min(dist1[j], dist1[index]+G[index][j]);
        }
    }
}

void DIJ2()
{
    dist2[x]=0;
    for(int i=1; i<=n; i++)
    {
        int index=1, MIN=INF;
        for(int j=1; j<=n; j++)
        {
            if(!vis2[j] && dist2[j]<MIN)
            {
                index=j, MIN=dist2[j];
            }
        }
        vis2[index]=1;
        for(int j=1; j<=n; j++)
        {
            dist2[j]=min(dist2[j], dist2[index]+G[j][index]);
        }
    }
}


int main()
{
    while(scanf("%d%d%d", &n, &m, &x)!=EOF)
    {
        IN();

        for(int i=0; i<m; i++)
        {
            scanf("%d%d%d", &a, &b, &t);
            G[a][b]=t;
        }

        DIJ1();
        DIJ2();

        int ans=0;
        for(int i=1; i<=n; i++)
            ans=max(ans, dist1[i]+dist2[i]);

        printf("%d\n", ans);
    }
    return 0;
}

 

posted on 2015-07-21 09:03  栀蓝  阅读(133)  评论(0编辑  收藏  举报

levels of contents