Silver Cow Party

给定一个牛A,所有牛都要去牛A那里参加活动,参加完后动后返回,所有的路是单向的。



------------------------------------------------------------------------------
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn=10200;
#define oo 1100000
int low[maxn];
int Map[1200][1200];
int v[maxn];
int ans,n;
void dij(int x)
{
    memset(v,0,sizeof(v));
    for(int i=1; i<=n; i++)
        low[i] = Map[x][i];
    v[x] = 1;
    for(int i=2; i<=n; i++)
    {
        int Min = oo;
        int index;
        for(int j=1; j<=n; j++)
        {
            if(!v[j]&&low[j]<Min)
            {
                Min = low[j];
                index = j;
            }
        }
        v[index] = 1;
        for(int j=1; j<=n; j++)
            if(!v[j]&&low[j]>Min+Map[index][j])
                low[j] = Min + Map[index][j];
    }
}
int main()
{
    int a,b,c,m,x;
    int way[maxn];
    while(~scanf("%d%d%d",&n,&m,&x))
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
        {
            if(i!=j)
            Map[i][j] = oo;
            else
                Map[i][j] = 0;

        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            
               Map[a][b]  = c;
        }
        dij(x);
        for(int i=1;i<=n;i++)
            way[i] = low[i];
        
        for(int i=1;i<=n;i++)//矩阵交换
            for(int j=i+1;j<=n;j++)
        {
            int k = Map[j][i];
            Map[j][i] = Map[i][j];
            Map[i][j] = k;
        }
        dij(x);
        ans = 0;
        for(int i=1; i<=n; i++)
        {
            if(i != x)
            {
                ans = max(ans,low[i]+way[i]);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2016-07-22 15:30  biu~biu~biu~  阅读(123)  评论(0编辑  收藏  举报