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 }
越自律,越自由