[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。

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int i,j,n,m,k,x,y,mx,a[110][110];
 4 
 5 int 
 6 pre(void)
 7 {
 8     memset(a,1,sizeof(a));
 9     return 0;
10 }
11 
12 int 
13 add(int x,int y)
14 {
15     a[x][y]=1;
16     a[y][x]=1;
17     return 0;
18 }
19 
20 int
21 min(int a,int b)
22 {
23     if (a<b) return(a);
24     else return(b);
25 }
26 
27 int 
28 init(void)
29 {
30     scanf("%d%d
",&n,&m);  
31     for(i=1;i<=m;i++)
32     {
33         scanf("%d%d",&x,&y);
34         add(x,y);
35     }
36     return 0;
37 }
38 
39 int 
40 main(void)
41 {
42     pre();
43     init();
44     
45 for(k=1;k<=n;k++)
46     for(i=1;i<=n;i++)
47         for(j=1;j<=n;j++)
48             if ((i!=j)&&(i!=k)&&(k!=j))
49             a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
50     
51     mx=-35111111;
52     for(i=1;i<=n;i++)
53         for(j=1;j<=n;j++)
54         if(i!=j)
55         if (a[i][j]>mx) mx=a[i][j];
56     
57    printf("%d
",mx);
58     return 0;
59 }
60         
61             
原文地址:https://www.cnblogs.com/sxiszero/p/3601338.html