hdu6152 拉姆齐定理

hdu6152    Friend-Graph

题意:给出 n 个人的关系,问是否有 3 个人两两是朋友,或 3 个人两两不是朋友。

tags:n>=6的就不是,< 的暴力枚举。

拉姆齐定理的通俗表述
6 个人中至少存在3人相互认识或者相互不认识。
该定理等价于证明这6个顶点的完全图的边,用红、蓝二色任意着色,必然至少存在一个红色边三角形,或蓝色边三角形。
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a; i<=b; ++i)
#define per(i,b,a) for (int i=b; i>=a; --i)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define MP make_pair
#define PB push_back
#define fi  first
#define se  second
typedef long long ll;
const int N = 3005;

int n, a1[N], a2[N], t1, t2, G[10][10];
int main()
{
    int T;  scanf("%d", &T);
    int n, aij;
    while(T--)
    {
        mes(G, 0);
        scanf("%d", &n);
        rep(i,1,n-1)
        {
            rep(j,1,n-i)
            {
                scanf("%d", &aij);
                if(n<6 && aij==1) G[i][j+i]=G[j+i][i]=1;
            }
        }
        if(n>=6) { puts("Bad Team!"); continue; }
        bool flag=0;
        rep(i,1,n)
        {
            t1=0, t2=0;
            rep(j,1,n) if(j!=i)
            {
                if(G[i][j]) a1[++t1]=j;
                else a2[++t2]=j;
            }
            rep(j,1,t1) rep(l,j+1,t1)
            {
                if(G[a1[j]][a1[l]]) { flag=1; break; }
            }
            rep(j,1,t2) rep(l,j+1,t2)
            {
                if(G[a2[j]][a2[l]]==0) { flag=1; break; }
            }
        }
        puts(flag ? "Bad Team!" : "Great Team!");
    }

    return 0;
}
posted @ 2017-08-22 19:22  v9fly  阅读(206)  评论(0编辑  收藏  举报