POJ 3268 Silver Cow Party

来源:互联网 发布:光子嫩肤永久有效知乎 编辑:程序博客网 时间:2024/06/05 04:51

题意:

描述一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。每头母牛必需参加宴会并且在宴会结束时回到自己的领地,但是每头牛都很懒而喜欢选择化是最少的一个方案。来时的路和去时的可能不一样。求每头牛要来回的最短时间。输入第一行:三个用空格分开的整数:N,M和X第2到第M+1行:第i+1描述路i,通过三个用空格分开的整数: Ai, Bi和Ti. 是对于从Ai号田到 Bi号田的描述,需要Ti的时间.输出第一行:一个整数:对于每头牛所必须花费的时间.(在这段时间内,每头牛可以来回)
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 1005const int inf=1<<29;int vis[N],w1[N][N],d1[N],w2[N][N],d2[N];int n,m,x;void dij1(int s){    int i,j;    memset(vis,0,sizeof(vis));    for(i=1;i<=n;i++)    {        d1[i]=w1[s][i];    }    d1[s]=0;    vis[s]=1;    for(i=1;i<=n;i++)    {        int now=inf,k;        for(j=1;j<=n;j++)        {            if(!vis[j]&&d1[j]<now)            {                now=d1[j];                k=j;            }        }        if(now==inf)        {            break;        }        vis[k]=1;        for(j=1;j<=n;j++)        {            if(!vis[j]&&d1[j]>d1[k]+w1[k][j])            {                d1[j]=d1[k]+w1[k][j];            }        }    }}void dij2(int s){    int i,j;    memset(vis,0,sizeof(vis));    for(i=1;i<=n;i++)    {        d2[i]=w2[s][i];    }    d2[s]=0;    vis[s]=1;    for(i=1;i<=n;i++)    {        int now=inf,k;        for(j=1;j<=n;j++)        {            if(!vis[j]&&d2[j]<now)            {                now=d2[j];                k=j;            }        }        if(now==inf)        {            break;        }        vis[k]=1;        for(j=1;j<=n;j++)        {            if(!vis[j]&&d2[j]>d2[k]+w2[k][j])            {                d2[j]=d2[k]+w2[k][j];            }        }    }}int main(){    while(scanf("%d%d%d",&n,&m,&x)!=EOF)    {        int i,j;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                if(i==j)                {                    w1[i][j]=0;                    w2[i][j]=0;                }                else                {                    w1[i][j]=inf;                    w2[i][j]=inf;                }            }        }        int u,v,c;        while(m--)        {            scanf("%d%d%d",&u,&v,&c);            if(c<w1[u][v])            {                w1[u][v]=c;            }            if(c<w2[v][u])            {                w2[v][u]=c;            }        }        dij1(x);        dij2(x);        int MIN=-1;        for(i=1;i<=n;i++)        {            if(x!=i)            {                 MIN=max(MIN,d1[i]+d2[i]);            }        }        printf("%d\n",MIN);    }    return 0;}


0 0
原创粉丝点击