poj 3268 (dijkstra)

来源:互联网 发布:合肥宝德网络 编辑:程序博客网 时间:2024/05/05 20:48

这里写链接内容 http://poj.org/problem?id=3268

题目意思 :有n个牛分别在n个农场,每个牛都需要从自己的农场到另一个大牛的农场参加生日聚会,问这些牛中去和返回用时的最长的时间是多少。
思路:因为我没有仔细想考吧,wa了很多次,这道题对于我来说还是挺简单的,写的时候考虑到了一个问题,但是当时没有去想,就wa了好几次,也没改出来,心不仔细,挺难受的,也总是会犯这样的错误,希望以后慢慢地改了吧,就是去和返回最短路求一下,最后加在一起求最长的时间

#include<stdio.h>#include<algorithm>#include<string.h>#include<iostream>using namespace std;const int INF=0x3f3f3f3f;const int N=1005;int e[N][N],e1[N][N],book[N],dis[N],dis1[N];int i,j,n,m,x;void dijkstra(){    memset(book,0,sizeof(book));      for(i=1; i<=n; i++)        {            dis[i]=e[x][i];            //dis1[i]=e1[x][i];        }        dis[x]=0;        //dis1[x]=0;    book[x]=1;    int min,u;    for(i=1; i<=n-1; i++)    {        min=INF;        u=0;        for(j=1; j<=n; j++)        {            if(book[j]==0&&dis[j]<min)            {                min=dis[j];                u=j;            }        }        if(min==INF)            break;        book[u]=1;        for(int v=1; v<=n; v++)        {            if(e[u][v]<INF&&dis[v]>dis[u]+e[u][v])                dis[v]=dis[u]+e[u][v];        }    }}void dijkstra1(){    memset(book,0,sizeof(book));      for(i=1; i<=n; i++)        {           // dis[i]=e[i][x];            dis1[i]=e1[x][i];        }       // dis[x]=0;        dis1[x]=0;    book[x]=1;    int min1,u1;    for(i=1; i<=n-1; i++)    {        min1=INF;        u1=0;        for(j=1; j<=n; j++)        {            if(book[j]==0&&dis1[j]<min1)            {                min1=dis1[j];                u1=j;            }        }        if(min1==INF)            break;        book[u1]=1;        for(int v=1; v<=n; v++)        {            if(e1[u1][v]<INF&&dis1[v]>dis1[u1]+e1[u1][v])                dis1[v]=dis1[u1]+e1[u1][v];        }    }}int main(){    int a,b,t;    while(~scanf("%d%d%d",&n,&m,&x))    {        for(i=1; i<=n; i++)        {            for(j=1; j<=n; j++)            {                if(i==j)                {                    e[i][j]=0;                    e1[i][j]=0;                }                else                {                    e[i][j]=INF;                    e1[i][j]=INF;                }            }        }        for(i=1; i<=m; i++)        {            scanf("%d %d %d",&a,&b,&t);            e[b][a]=t;            e1[a][b]=t;        }        dijkstra();        dijkstra1();        int max=-1;        for(i=1; i<=n; i++)        {            if(dis1[i]+dis[i]<INF&&dis[i]+dis1[i]>max)                max=dis1[i]+dis[i];        }        printf("%d\n",max);    }    return 0;}
0 0