简化题意
给定一个 N N N 个点, M M M 条边的图,求其中最长的一条最短路径的长度。
N ≤ 100 N \leq 100 N≤100, M ≤ N × ( N − 1 ) 2 M \leq \frac{N\times(N-1)}{2} M≤2N×(N−1)
思路
先解释一下简化题意:
首先最短路径对应原题面的拉紧的绳索,因为两点之间最短路径只可能有如下两种情况:
-
一段拉紧的较短绳索;
-
一段没拉紧的较长绳索。
上述情况如下图:
而最长的一条最短路径的长度,就是最多的被拉紧的绳索数量,因为每条绳索长度相同,所以每条边边权相同,设其为 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 停止支持,还是很可惜。