P10942 GF和猫咪的玩具 黄 题解

简化题意

给定一个 N N N 个点, M M M 条边的图,求其中最长的一条最短路径的长度

N ≤ 100 N \leq 100 N100 M ≤ N × ( N − 1 ) 2 M \leq \frac{N\times(N-1)}{2} M2N×(N1)


思路

先解释一下简化题意:

首先最短路径对应原题面的拉紧的绳索,因为两点之间最短路径只可能有如下两种情况:

  1. 一段拉紧的较短绳索;

  2. 一段没拉紧的较长绳索。

上述情况如下图:

最长的一条最短路径的长度,就是最多的被拉紧的绳索数量,因为每条绳索长度相同,所以每条边边权相同,设其为 1 1 1 则求出的值即为题目要求的答案。

综上这题是一道多源最短路模板,观察数据特点(不限制边数)考虑 Floyd。


代码

#include <bits/stdc++.h>
using namespace std;

int n,m,ans,f[110][110];

int main () {
    cin>> n>> m;
    memset (f,0x3f,sizeof (f));
    for (int i=1;i<=n;i++) f[i][i]=0;
    for (int i=1,a,b;i<=m;i++) {
        cin>> a>> b;
        f[a][b]=f[b][a]=1;
    }
    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                if (f[i][j]>f[i][k]+f[k][j])
                    f[i][j]=f[i][k]+f[k][j];
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            ans=max (ans,f[i][j]);
    cout<< ans;
    return 0;
}

后记

图片由画图3D软件制作,但是这么好的软件将在 2024/11/4 在 Windows 停止支持,还是很可惜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值