AcWing385. GF和猫咪的玩具——Floyd算法
博主回归了
题目来源
385. GF和猫咪的玩具 - AcWing题库
题目描述
GF 同学和猫咪得到了一个特别的玩具,这个玩具由 𝑛个金属环(编号为 1∼n)和 m条绳索组成,每条绳索连接两个不同的金属环,并且长度相同。
GF 左手拿起金属环 L
猫咪右手(或者说:爪)拿起金属环 R(L不等于 R),
然后尽量的向两边拉,他希望选择合适的 L和 R,使得被拉紧的绳索尽量的多。
注:如果像样例那样 1−2−4−3−5−6−1
构成了一个环,我们认为拉 1和 3
时只能拉紧一边(1−2−4−3或 3−5−6−1)而不算全部拉紧。
通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。
输入格式
第一行包含两个正整数 n,m
接下来的 m行包含两个正整数 a,b,表示有一条绳索连接了a和b的绳索。
输出格式
仅包含一个整数,表示最多能拉紧的绳索数。
数据范围
2≤n≤100
2
≤
𝑛
≤
100
输入样例:
6 6
1 2
1 6
2 4
6 5
4 3
5 3
输出样例:
3
算法分析
Floyd变式题
题目似乎和最短路没有任何关系,但是仔细分析(拉链原理)就会发现这是道多源汇最短路问题(求两两之间的最短路)
O(n^3)可以接受。
AC code
#include <bits/stdc++.h>
using namespace std;
const int N=110;
int d[N][N];
int n,m;void Floyd() {for(int k=1; k<=n; k++)for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}int main() {memset(d,0x3f,sizeof d);cin>>n>>m;while(m--) {int a,b;cin>>a>>b;d[a][b]=d[b][a]=1;}Floyd();int res=0;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)res=max(res,d[i][j]);cout<<res;return 0;
}