POJ 3268 Silver Cow Party 正反单源最短路

本文探讨了如何在有向图中利用Dijkstra算法解决寻找某点到其他点距离和以及反过来的问题,并通过实例展示了算法的实现过程。文章还提及了在编码时遇到的一个误区,即误设最小成本值导致错误结果,最终通过调整代码成功解决了问题。

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

题目 求哪个到点X的距离和X到这个点的距离之和最小。

1.点X到个点距离最小:即普通最短路,起点为X,终点为其余个点。

2.各点到X的距离最小:X为终点,其余个点为起点。如果图是无向图,情况2和情况1是一样的,在无向图中终点起点交换有什么关系呢。

但是本题是有向图,其实也很简单,只需要把各边的方向调换一下,把X当起点,用情况1的方法求,得出的答案就是最后的答案。(可以在纸上画一下,正确性显而易见)

最后枚举一下哪个距离和最大就可以了。

吐槽一下:我看题目写了花费Ti (1 ≤ Ti ≤ 100),于是把minc设为101.结果wa了两次,难道是我瞎了?!


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int mp[1005][1005],vis[1005],lowc1[1005],lowc2[1005];
int m,n,x;

void Dijstra1(int beg)  //去的花费
{
    for(int i=1;i<=n;i++)
    {
        vis[i]=0;
        lowc1[i]=mp[i][beg];
    }
    lowc1[beg]=0;
    for(int j=1;j<=n;j++)
    {
        int minc=10000000,p=-1;
        for(int i=1;i<=n;i++)
            if(!vis[i] && lowc1[i]<minc)
            {
                minc=lowc1[i];
                p=i;
            }
        vis[p]=1;
        for(int i=1;i<=n;i++)
            if(!vis[i] && lowc1[i]>lowc1[p]+mp[i][p])
                lowc1[i]=lowc1[p]+mp[i][p];
    }
}

void Dijstra2(int beg)  //回来的花费
{
    for(int i=1;i<=n;i++)
    {
        vis[i]=0;
        lowc2[i]=mp[beg][i];
    }
    lowc2[beg]=0;
    for(int j=1;j<=n;j++)
    {
        int minc=10000000,p=-1;
        for(int i=1;i<=n;i++)
            if(!vis[i] && lowc2[i]<minc)
            {
                minc=lowc2[i];
                p=i;
            }
        vis[p]=1;
        for(int i=1;i<=n;i++)
            if(!vis[i] && lowc2[i]>lowc2[p]+mp[p][i])
                lowc2[i]=lowc2[p]+mp[p][i];
    }
}

int main()
{
    int u,v,w;
    while(~scanf("%d%d%d",&n,&m,&x))
    {
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            mp[i][j]=10000000;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            if(mp[u][v]>w)
                mp[u][v]=w;
        }
        Dijstra1(x);
        Dijstra2(x);
        int ans=-1;
        for(int i=1;i<=n;i++)
            //printf("%d %d\n",lowc1[i],lowc2[i]);
            ans=max(ans,lowc1[i]+lowc2[i]);
        printf("%d\n",ans);
    }
    return 0;
}

这题写完最短路先告一段落,还有Dijstra优化版本没做,单源bellman_ford、spfa,多源最短路flyod没做。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值