#include <iostream>
using namespace std;
const int maxn = 1500;
int f[maxn];//记录父系
int enemy[maxn];
int find(int x) {
if (f[x] != x) {
return f[x] = find(f[x]);
//要更新x的祖先
} else {
return x;//如果主线是自己就停下
}
}
void merge(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
f[rootX] = rootY; // 将一个集合的代表指向另一个集合的代表
}
}
int main() {
int n;
int m;
cin >> n >> m;
for (int i = 1; i <= n; i++)f[i] = i; //进行初始化 让每一个i都指向自己、
string op;
int a, b;
while (m--) {
cin >> op >> a >> b;
if (op == "F") {
merge(a, b); //直接合并
} else {
//都没有敌人标记两个都是敌人不做z
if (!enemy[a] && !enemy[b]) { //更新
enemy[a] = b;
enemy[b] = a;
}
//一个有敌人 b有敌人
else if (!enemy[a]) {
merge(a,enemy[b]);//a和b的敌人合并
enemy[a]=b;//跟新a的帝人1
}
//a 有敌人
else if (!enemy[b]) {
merge(b,enemy[a]);//b和a的敌人合并
enemy[b]=a;//跟新b的帝人1
}
else if(enemy[a]&&enemy[b])//wab//都有敌人
{
merge(enemy[a],b);
merge(enemy[b],a);
enemy[b]=a;enemy[a]=b;
}
//都有敌人
}
//TODO
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(find(i)==i)sum++;
}
cout<<sum<<endl;
return 0;
}
p1892团队
最新推荐文章于 2024-05-21 20:29:42 发布