tyvj1423(所有点对之间的最短路)
GF和猫咪的玩具
描述 Description
GF同学和猫咪得到了一个特别的玩具,这个玩具由n个金属环(编号为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)而不算全部拉紧。通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。
注:如果像样例那样1-2-4-3-5-6-1构成了一个环,我们认为拉1和3时只能拉紧一边(1-2-4-3或3-5-6-1)而不算全部拉紧。通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。
输入格式 InputFormat
第一行包含两个正整数n,m
接下来的m行包含两个正整数a,b,表示有一条绳索连接了a和b的绳索。
n<=100
接下来的m行包含两个正整数a,b,表示有一条绳索连接了a和b的绳索。
n<=100
输出格式 OutputFormat
仅包含一个整数,表示最多能拉紧的绳索数。
样例输入 SampleInput [复制数据]
6 6
1 2
1 6
2 4
6 5
4 3
5 3
样例输出 SampleOutput [复制数据]
3
拉紧的绳子数量等价于求所有点对之间路径上最少点数
最后找最大值即可
直接floyd
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn=110; const int nil=(0x7f7f7f7f)/2; int a[maxn][maxn]; int main(){ int n,m; int x,y; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) a[i][j]=nil; for (int i=1;i<=m;i++){ scanf("%d%d",&x,&y); a[x][y]=1; a[y][x]=1; } for (int k=1;k<=n;k++){ for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ if(i!=j&&i!=k&&j!=k) a[i][j]=min(a[i][j],a[i][k]+a[k][j]); } } } int ans=-nil; for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++){ if(i!=j&&a[i][j]<nil) ans=max(ans,a[i][j]); } } printf("%d",ans); return 0; }