线上OJ:
核心思想:
1、朋友的朋友就是朋友
。这句话意味着朋友之间直接合并。
2、敌人的敌人就是朋友
。这句话说明,如果 a 和 b 是敌人,a 和 c 也是敌人,则 c 和 b 就是朋友。如果 a 和 d 也是敌人,则 d 和 {c, b} 都是朋友。
2.1 所以当 a 和 x 是敌人时,把 x
和 a 的敌人
合并即可。用一个数组 a[i] 记录第 i 个人的敌人(只需记录一个即可,因为合并时会合并他们的根节点)。
2.2 如果 a 和 x 是敌人,但 a[i] 数组为空,则把 x 赋值给 a[i],作为它的第一个敌人。
3、最后判断有几个团伙时,只要数下有几个根即可(p[i]==i 的为根)。
题解代码:
#include <bits/stdc++.h>
using namespace std;
int p[1010], enemy[1010] = {
0}, n, m, x, y, k;
int find(int x