Silver Cow Party

描述

一头牛从每个N农场(1≤N≤1000)方便编号1 . .N是去参加大牛党在农场举行# X(1≤X≤N)。总共M(1≤≤100000)单向(单向道路连接对农场;路我需要Ti(1≤Ti≤100)单位的遍历。

每个牛必须走到党和党结束后,回到自己的农场。每头牛是懒惰,从而选择最优路线最短的时间。一头牛的回归路线可能不同于她最初的道路单向以来党的路线。

所有的奶牛,最长的时间是什么牛必须花走到党和回来吗?

输入

1号线:三个空格分隔的整数,分别为:N,M,X
行2 . .M + 1:线我+ 1描述道路三个空格分隔的整数:Ai,Bi,Ti。描述道路Ai从农场到农场Bi运行,需要遍历Ti时间单位。

输出

1号线:一个整数:最大的时间任何一头牛必须走。

样例输入

4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

样例输出

10

提示

牛4直接收益方(3单元),并返回通过农场1和3(7台),总共10个时间单位。

代码

#include 
#include 
#include 
#include 
using namespace std;
const int MAXN=1010;
const int INF=0x3f3f3f3f;
bool vis[MAXN];
void Dijkstra(int cost[][MAXN],int lowcost[],int n,int beg)
{
    for(int i=1;i<=n;i++)
    {
        lowcost[i]=INF;
        vis[i]=false;
    }
    lowcost[beg]=0;
    for(int j=0;jint k=-1;
        int Min=INF;
        for(int i=1;i<=n;i++)
            if(!vis[i]&&lowcost[i]if(k==-1)break;
        vis[k]=true;
        for(int i=1;i<=n;i++)
            if(!vis[i]&&lowcost[k]+cost[k][i]int dist1[MAXN];
int dist2[MAXN];
int cost[MAXN][MAXN];
int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int N,M,X;
    int u,v,w;
    while(scanf("%d%d%d",&N,&M,&X)==3)
    {
        for(int i=1;i<=N;i++)
            for(int j=1;j<=N;j++)
            {
                if(i==j)cost[i][j]=0;
                else cost[i][j]=INF;
            }
        while(M--)
        {
            scanf("%d%d%d",&u,&v,&w);
            cost[u][v]=min(cost[u][v],w);
        }
        Dijkstra(cost,dist1,N,X);
        for(int i=1;i<=N;i++)
            for(int j=1;jint ans=0;
        for(int i=1;i<=N;i++)
            ans=max(ans,dist1[i]+dist2[i]);
        printf("%d\n",ans);
    }
    return 0;
}

AC截图

这里写图片描述

测试截图

Silver Cow Party_第1张图片

你可能感兴趣的:(POJ)