Friend-Graph HDU - 6152 图论 拉姆齐定律 最大团

题意:

在一个团队中如果有三个或更多人之间互相认识或互相不认识,那么这个团队就被称为”Bad Team”,否则被称为”Great Team”。给定一个团队的信息,然你判定这个团队是哪一种。

分析:

问题可以抽象为在一个点数为 N N 的无向图中是否存在一个完全图Kn Kn K n 代表定点数为 n n 的完全图。),3nN,又由于 Kn,3nN K n , 3 ≤ n ≤ N 中必然包含 K3 K 3 ,所以问题最终转化为所给图中是否含有 K3 K 3 .这就比较容易了。这道题还应用了拉姆齐定律,拉姆齐定律是这样的:6 个人中至少存在3人相互认识或者相互不认识。,那么当 n6 n ≥ 6 时,我就可以直接判定该队为Bad Team。这样我们就大大降低了复杂度。当 n<6 n < 6 时,我们首先从任一点出发进行dfs,看能否由此点出发找到 K3 K 3 ,其实也就是找到一个长度为3的环,能否找到这个环对应了是否含有三个人相互认识。而对于三个人相互不认识,我们可以将邻接矩阵中的1变为0,0变为1,再次进行上述寻找 K3 K 3 的操作即可。

点此查看拉姆齐定理百度百科

代码:

#include <bits/stdc++.h>
#define FP(PP,QQ,RR) for(int PP = QQ;PP < RR;PP ++)
using namespace std;
int r,n;
int G[6][6],st;
vector <int> se;
bool dfs(int s){
    if(se.size() == 3){
        return G[s][st];
    }
    FP(i,s + 1,n){
        if(G[s][i]){
            se.push_back(i);
            if(dfs(i)) return true;
            else se.pop_back();
        }
    }
    return false;
}
bool solve(){
    memset(G,0,sizeof G);
    FP(i,0,n - 1)
        FP(j,i + 1,n){
            cin >> G[i][j];
            G[j][i] = G[i][j];
        }
    FP(i,0,n){
        st = i;
        se.push_back(i);
        if(dfs(i)) return true;
        se.clear();
    }
    FP(i,0,n){
        FP(j,0,n){
            if(i != j){
                G[i][j] = !G[i][j];
            }
        }
    }
    FP(i,0,n){
        st = i;
        se.push_back(i);
        if(dfs(i)) return true;
        se.clear();
    }
    return false;
}
int main(void)
{
    cin >> r;
    while(r --){
        cin >> n;
        if(n >= 6){
            int t,i = 0;
            while(i ++ < (n - 1) * n / 2){
                cin >> t;
            }
        }
        cout << ((n >= 6 || solve()) ? "Bad Team!" : "Great Team!") << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值