以下是我的代码:
#include<bits/stdc++.h>
using namespace std;
int fa[1001], enemy[1001];
int find_pa(int x);
int main()
{
int n, rela_num;
cin >> n >> rela_num;
int i;
for(i = 1; i <= n; i++) fa[i] = i, enemy[i] = 0;
for(i = 1; i <= rela_num; i++)
{
char rela;
int x, y;
cin >> rela >> x >> y;
if(rela == 'F')
{
if(fa[x] == x) fa[x] = y;
else fa[find_pa(x)] = find_pa(y);
}
else
{
if(enemy[x] == 0)
enemy[x] = y;
else //说明x的敌人是enemy[x]=z, 而且x和y也是敌人,那么y和z是朋友
{
if(fa[y] == y) fa[y] = enemy[x];
else fa[find_pa(y)] = find_pa(enemy[x]);
}
if(enemy[y] == 0)
enemy[y] = x;
else
{
if(fa[x] == x) fa[x] = enemy[y];
else fa[find_pa(x)] = find_pa(enemy[y]);
}
}
}
int ans = n;
for(i = 1; i <= n; i++)
{
if(fa[i] != i) ans--;
}
cout << ans;
}
int find_pa(int x)
{
if(fa[x] == x) return x;
return fa[x] = find_pa(fa[x]);
}
下面是AC代码
#include<iostream>
#include<string>
using namespace std;
int n, m, f[1001], enm[1001]; //f存放节点的父亲,enm存放每个人的敌人
int find(int x) { //寻找x的祖先
while (f[x] != x) x = f[x]; //不断更新寻找祖先
return x;
}
void hebing(int x, int y) { //中文看得懂吧
x = find(x);
y = find(y); //无判定超简单合并_(:з」∠)_照顾一下和我一样的萌新
if (x == y) return;
f[y] = x;
return;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
f[i] = i;
for (int i = 1; i <= m; i++) {
int p, q;
char c;
cin >> c >> p >> q;
if (c == 'F') hebing(p, q); //是朋友就合并
else {
if (enm[p] == 0) enm[p] = find(q);
else hebing(q, enm[p]); //一个人有两个或更多敌人,合并他们
if (enm[q] == 0) enm[q] = find(p);
else hebing(p, enm[q]);
}
}
int count[1001] = {0};
for (int i = 1; i <= n; i++)
count[find(i)]++;
int cnt = 0;
for (int i = 1; i <= n; i++)
if (count[i]) cnt++; //统计,做得不是很简洁
cout << cnt;
}