P10942 GF和猫咪的玩具 黄 题解

简化题意

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

\(N \leq 100\)\(M \leq \frac{N\times(N-1)}{2}\)


思路

先解释一下简化题意:

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

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

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

上述情况如下图:

最长的一条最短路径的长度,就是最多的被拉紧的绳索数量,因为每条绳索长度相同,所以每条边边权相同,设其为 \(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 停止支持,还是很可惜。

posted @ 2025-03-04 20:52  M_CI  阅读(24)  评论(0)    收藏  举报