好吧,前两天做了一场CF,遇到一道并查集的题目,感觉并查集还需学习啊,记录一下 具体的算法如下
- 有father数组,全部初始化为本身
- 添加一个关系进来的时候,s–t,找到s的祖先a,t的祖先b,将a的father设为b
- 通过查找祖先,来确定是否在一个集合内
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void init(int n){ for (int i=1;i<=n;i++) father[i]=i; }
int find(int x) { while (father[x]!=x) x=father[x]; return x; }
void add(int s,int t) { int a=find(s); int b=find(t); father[a]=b; }
bool judge(int s,int t) { return find(s)==find(t); }
|