Friend-Graph HDU - 6152 (Ramsey定理)

Practice link: https://vjudge.net/problem/HDU-6152

题意:给你 n 个人,并且给出他们之间的关系,朋友是 1,不是朋友是 0,如果有三个人及以上的人相互认识或相互不认识,则输出“Bad Team!",否则输出“Great Team!”。

Ramsey定理:在组合数学上,拉姆齐(Ramsey)定理,又称拉姆齐二染色定理,是要解决以下的问题:要找这样一个最小的数n,使得n个人中必定有 k 个人相识或 l 个人互不相识。那么R(k,l)=n。 
Ramsey定理应用的一个通俗的例子【友谊定理】:世界上任意6个人中,总有3个人相互认识,或互相皆不认识。即R(3,3)=6

思路:根据Ramsey定理可知,如果n大于6,一定是bad ,如果n小于6就暴力判断一下即可。

代码:

 1 int mp[10][10];
 2 int main()
 3 {
 4     int t,n;
 5     cin>>t;
 6     while(t--){
 7         scanf("%d",&n);
 8         mem(mp,0);
 9         if(n>6){
10             for(int i=1;i<n;i++){
11                 for(int j=1;i+j<=n;j++){
12                     int x;
13                     scanf("%d",&x);
14                 }
15             }
16             printf("Bad Team!\n");
17         }else{
18         for(int i=1;i<n;i++){
19             for(int j=1;i+j<=n;j++){
20                 scanf("%d",&mp[i][i+j]);
21             }
22         }
23         for(int i=1;i<=n;i++){
24             for(int j=1;j<=n;j++){
25                 mp[i][j]=max(mp[i][j],mp[j][i]);
26             }
27         }
28         int p=1;
29         for(int i=1;i<=n;i++){
30             for(int j=i+1;j<=n;j++){
31                 for(int k=j+1;k<=n;k++){
32                     if(mp[i][j]==mp[j][k]&&mp[j][k]==mp[i][k]){
33                         p=0;
34                         goto end;
35                     }
36                 }
37             }
38         }
39     end:;
40         if(p){
41             printf("Great Team!\n");
42         }else{
43             printf("Bad Team!\n");
44         }
45     }
46     }
47     return 0;
48 }

 

posted @ 2020-08-22 23:00  hachuochuo  阅读(305)  评论(0编辑  收藏  举报