poj 3268 (dijkstra)

本文介绍了一道经典的最短路径问题——POJ 3268牛聚会问题。通过两次迪杰斯特拉算法计算每头牛往返的最短时间,并找出总耗时最长的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写链接内容 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值