C - Friend-Graph HDU - 6152

该博客介绍了一种根据鸽巢原理和并查集方法判断团队是否为'BadTeam'或'GreatTeam'的算法。通过预处理每个人的朋友信息,两两遍历并检查是否有三人之间存在朋友关系的环,使用bitset存储和计算交集,从而确定团队状态。代码实现了这一逻辑,并在C++中给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在这个团队中村取出三个或三个以上的人来,如果他们互相为朋友,或者互相不是朋友那么这个团队是一个bad team,反之则为great team 。可以根据鸽巢原理,也就是用类似并查集的方法去找大小为3的环,如果1 和 2 是朋友我们只需要判断下 他们两个的朋友集合是否存在交集。这里我们用bitset来储存朋友信息,先预处理储存每个人的朋友信息,然后两两遍历,便利时将 i,和j+i 这两个 bitset  &一下,找到交集,如果集合中含有大于等于一个 1就可以让整个团队为bad team。因为互相为朋友和互相不为朋友其实是镜像关系,所以可以用相同的方法处理。

ACcode

//C - Friend-Graph HDU - 6152 
#include <iostream>
#include<cstring>
#include<algorithm>
#include<sstream>
#include<cmath>
#include<queue>
#include<bitset>
#include<vector>
#include<map>
#include<unordered_map>
#define int long long
#define endl '\n'
#define lowbit(x) (x &-x)
#define mh(x) memset(x, -1, sizeof h)
#define debug(x) cerr << #x << "=" << x << endl;
#define brk exit(0);
using namespace std;
void TLE() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); }
const int N = 3e3 + 10;
const int M = 2 * N;
const int mod = 998244353;
const double esp = 1e-6;
const double pi = acos(-1);
typedef pair<int, int> PII;
typedef long long ll;
bitset<3001>g[N], f[N], init;
bool tt[N][N];
void solve()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i++)
        g[i] = init, f[i] = init;
    for (int i = 1;i < n;i++)
    {
        for (int j = 1;j <= n - i;j++)
        {
            int x;
            cin >> x;tt[i][j] = x;
            if (x == 1)
                g[i][j + i] = 1, g[j + i][i] = 1;
            else if (x == 0)
                f[i][j + i] = 1, f[j + i][i] = 1;
        }
    }
    for (int i = 1;i < n;i++)
    {
        for (int j = 1;j <= n - i;j++)
        {
            if (tt[i][j] == 1)
            {
                bitset<3001>res = (g[i] & g[j + i]);
                if (res.count() >= 1)
                {
                    cout << "Bad Team!" << endl;
                    return;
                }
            }
            else
            {
                 bitset<3001>res = (g[i] & g[j + i]);
                res = (f[i] & f[j + i]);
                if (res.count() >= 1)
                {
                    cout << "Bad Team!" << endl;
                    return;
                }
            }
        }
    }
    cout << "Great Team!" << endl;
}

signed main()
{
    TLE();
    int T;cin >> T;
    while (T--)
        solve();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值