洛谷 P1522 牛的旅行 Cow Tours floyd 多源最短路

本文介绍了洛谷P1522题目的解题思路,主要利用Floyd算法求解多源最短路径。首先通过Floyd算法找出所有节点间的最短路径,然后计算每个节点到可达节点的最短路径最大值,最后处理不可直接到达的节点,结合边权计算最小路径。注意新连通的牧场直径不应小于原有牧场直径。
摘要由CSDN通过智能技术生成

题目链接:

https://www.luogu.org/problem/P1522

参考博客:

https://www.luogu.org/blog/ylsoi/solution-p1522

思路:

1:先用floyd求多源最短路,即一个节点到其他任意节点的最短路

2:然后对每一个节点,计算出它到其他可以到达的节点的最短路中的最大值,存在d[maxn]数组中

3:对于不可以直接到达的节点,我们一条一条的连上边,然后取d[i]+d[j]+edge(i,j)的最小值

            if(dis[i][j]==inf)
            {
                dmax2=min(dmax2,d[i]+edge(i,j)+d[j]);
            }

注意:

1:新连通的大牧场的直径怎么会比原来的小牧场的直径小呢?

#include <bits/stdc++.h>

using namespace std;
const int maxn=151;
const double inf=0x3f3f3f3f;
struct point
{
    int x,y;
}p[maxn];
double edge(int i,int j)
{
    return sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
int n,temp;
double dis[maxn][maxn],d[maxn],dmax1,dmax2=inf,ans;

int main()
{
    ios::sync_with_stdio(0);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&p[i].x,&p[i].y);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            scanf("%1d",&temp);
            if(temp)dis[i][j]=edge(i,j);
            else if(i!=j)dis[i][j]=inf;
        }
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(dis[i][j]>dis[i][k]+dis[k][j])
                {
                    dis[i][j]=dis[i][k]+dis[k][j];
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(dis[i][j]!=inf)
            {
                d[i]=max(d[i],dis[i][j]);
            }
            dmax1=max(dmax1,d[i]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(dis[i][j]==inf)
            {
                dmax2=min(dmax2,d[i]+edge(i,j)+d[j]);
            }
        }
        ans=max(dmax1,dmax2);
    }
    printf("%.6lf",ans);
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值