POJ 3268 Silver Cow Party

来源:互联网 发布:田岛美工刀片批发 编辑:程序博客网 时间:2024/04/30 13:00

题意:有n个点,m条有方向的边,中心在x。问从其他点到x,然后再从x到其他点的最小距离的最大值是多少?

正向建跑一次最短路,反向建图再跑一次最短路。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=1005;bool vis[N];int map[N][N],dis1[N],dis2[N];int main(){    int n,m,x;    scanf("%d%d%d",&n,&m,&x);    for(int i=0;i<m;i++)    {        int a,b,c;        scanf("%d%d%d",&a,&b,&c);        map[a][b]=c;    }    for(int i=1;i<=n;i++)    {        if(map[x][i]) dis1[i]=map[x][i];        else dis1[i]=1<<30;        if(map[i][x]) dis2[i]=map[i][x];        else dis2[i]=1<<30;    }    vis[x]=1;    for(int i=1;i<n;i++)    {        int imin=1<<30,pos=0;        for(int j=1;j<=n;j++)        {            if(dis1[j]<imin&&!vis[j])            {                imin=dis1[j];pos=j;            }        }        vis[pos]=1;        for(int j=1;j<=n;j++)        {            if(!map[pos][j]) continue;            if(dis1[j]>dis1[pos]+map[pos][j]&&!vis[j])            {                dis1[j]=dis1[pos]+map[pos][j];            }        }    }    memset(vis,0,sizeof(vis));    vis[x]=1;    for(int i=1;i<n;i++)    {        int imin=1<<30,pos=0;        for(int j=1;j<=n;j++)        {            if(dis2[j]<imin&&!vis[j])            {                imin=dis2[j];pos=j;            }        }        vis[pos]=1;        for(int j=1;j<=n;j++)        {            if(!map[j][pos]) continue;            if(dis2[j]>dis2[pos]+map[j][pos]&&!vis[j])            {                dis2[j]=dis2[pos]+map[j][pos];            }        }    }    int ans=0;    for(int i=1;i<=n;i++)    {        if(i==x) continue;        ans=max(ans,dis1[i]+dis2[i]);    }    printf("%d\n",ans);    return 0;}


原创粉丝点击