poj3268

来源:互联网 发布:火箭引擎 知乎 编辑:程序博客网 时间:2024/05/17 08:19

题目名称:Silver Cow Party

题目链接:http://poj.org/problem?id=3268


题意:有n个农场和m条单向的路和每条路通过所要的时间,除X外其他农场的牛都来X农场开party,结束都各自回家,问所有牛各自所花最短时间中 那个最大的时间是多少


思路:先正着求最短路然后再反过来求一次


代码如下:

#include<cstdio>#include<cstring>#include<string>#include<iostream>#include<queue>#include<vector>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1001;int dis[maxn][maxn];int d[maxn];bool inque[maxn];vector<int> vr[maxn];int n,m,x;void spfa(){    memset(inque,false,sizeof(inque));    queue<int> Q;    Q.push(x);    inque[x]=true;    d[x]=0;    while(!Q.empty())    {        int u=Q.front();        Q.pop();        inque[u]=false;        for(int v=1;v<=n;v++)        {            if(d[v]>d[u]+dis[u][v])            {                d[v]=d[u]+dis[u][v];                if(!inque[v])                {                    inque[v]=true;                    Q.push(v);                }            }        }    }}void Traverse(){    int i,j,tmp;    for(i=1;i<=n;i++)    {        for(j=1;j<i;j++)        {            tmp=dis[i][j];            dis[i][j]=dis[j][i];            dis[j][i]=tmp;        }    }}int main(){    while(scanf("%d%d%d",&n,&m,&x)!=EOF)    {        int u,v,w;        int dist[maxn];        memset(dis,INF,sizeof(dis));        memset(d,INF,sizeof(d));        for(int i=0;i<m;i++)        {            scanf("%d%d%d",&u,&v,&w);            if(w<dis[u][v])            {                dis[u][v]=w;            }        }        spfa();   //求去X的最短路        for(int i=1;i<=n;i++)        {            dist[i]=d[i];        }        Traverse();      //反转        memset(d,INF,sizeof(d));        spfa();     //求回家的最短路        int sum=0;        for(int i=1;i<=n;i++)        {            sum=max(sum,d[i]+dist[i]);        }        printf("%d\n",sum);    }    return 0;}



0 0
原创粉丝点击