[TYVJ] P1423 GF和猫咪的玩具

时间:2023-03-10 02:33:16
[TYVJ] P1423 GF和猫咪的玩具

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)而不算全部拉紧。通俗地说,也就是当两个环之间有几个绳索数相等的连接方法时,只算其中一条连接方法拉紧,不算全部拉紧。

输入格式 InputFormat
第一行包含两个正整数n,m
接下来的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

题解:最短路变形题。n<=100 所以O(n3)的Floyd就可以AC。

代码:

 #include<stdio.h>
#include<string.h>
int i,j,n,m,k,x,y,mx,a[][]; int
pre(void)
{
memset(a,,sizeof(a));
return ;
} int
add(int x,int y)
{
a[x][y]=;
a[y][x]=;
return ;
} int
min(int a,int b)
{
if (a<b) return(a);
else return(b);
} int
init(void)
{
scanf("%d%d\n",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
}
return ;
} int
main(void)
{
pre();
init(); for(k=;k<=n;k++)
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if ((i!=j)&&(i!=k)&&(k!=j))
a[i][j]=min(a[i][j],a[i][k]+a[k][j]); mx=-;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
if(i!=j)
if (a[i][j]>mx) mx=a[i][j]; printf("%d\n",mx);
return ;
}