P1892 [BOI2003] 团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
写这个题写的心烦。一开始感觉和生物链很像,想用带权并查集写来着,写了一下,但是RE了;正解很简单,是将点数扩大乘2,就能装下敌人和朋友关系了;
#include <iostream>
using namespace std;
int n, m, p[2010], ans;
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= 2 * n; i ++ )
p[i] = i;
while(m -- )
{
char op[2];
int x, y;
scanf("%s%d%d", op, &x, &y);
int px = find(x), py = find(y);
if(*op == 'E')
{
//让x的敌人所在集合的祖宗指向y的祖宗
int ex = find(x + n), ey = find(y + n);
p[ex] = py;
//让y的敌人所在集合的祖宗指向x的祖宗
p[ey] = px;
}
else
{
p[px] = py;
}
}
for(int i = 1; i <= n; i ++ )
if(i == find(i))
{
ans ++;
}
cout << ans << endl;
return 0;
}