团伙
2024年12月25日小于 1 分钟
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
int n; // n 个人
int m; // m 组关系
// 并查集
int fa[MAXN * 2 + 5];
int cnt[MAXN * 2 + 5];
int findFa(int x)
{
if (fa[x] == x)
return x;
return fa[x] = findFa(fa[x]);
}
int main()
{
// n 个人
cin >> n;
// 并查集初始化
for (int i = 1; i <= n; i++)
{
fa[i] = i;
cnt[i] = 1;
// i+n 为 i 的敌人对应的集合
fa[i + n] = i + n;
cnt[i + n] = 0;
}
// m 组关系
cin >> m;
for (int i = 1; i <= m; i++)
{
char op;
int p, q;
cin >> op >> p >> q;
if (op == 'E')
{
// 两个人之间为敌人
// 合并 p ~ q+n
int fa1 = findFa(p);
int fa2 = findFa(q + n);
if (fa1 != fa2)
{
fa[fa1] = fa2;
cnt[fa2] += cnt[fa1];
}
// 合并 q ~ p+n
fa1 = findFa(q);
fa2 = findFa(p + n);
if (fa1 != fa2)
{
fa[fa1] = fa2;
cnt[fa2] += cnt[fa1];
}
}
if (op == 'F')
{
// 两个人之间为朋友
// 合并 p ~ q
int fa1 = findFa(p);
int fa2 = findFa(q);
if (fa1 != fa2)
{
fa[fa1] = fa2;
cnt[fa2] += cnt[fa1];
}
}
}
int ans = 0;
for (int i = 1; i <= 2 * n; i++)
if (fa[i] == i && cnt[i] > 0)
ans++;
cout << ans;
return 0;
}