并查集
并查集是一个树形的数据结构,每一个父节点的子节点都与它父亲具有关系属性(传递性),就相当于把一些具有相同属性的元素放进一个集合中。常常用于找祖宗(找共同)etc。
这个代码分为四部分:初始化,找父亲,合并, 查找。
1.初始化:
让他们自己是自己的父亲节点
void init(){ for(int i=1;i<=n;i++){ f[i]=i; } }
2.找父亲节点
当自己是自己父亲时便return,其余的时候路径压缩递归
int get_f(int v){ if(f[v]==v) return v; else{ return f[v]=get_f(f[v]);//路径压缩 } }
3.合并
假如这两个点不具有同一父亲,就用靠左原则,都并到同同一父节点之下。
void merge(int v,int u){ int t1,t2; t1=get_f(v); t2=get_f(u); if(t1!=t2){ f[t2]=t1; } return ; }
4.查询
一定要用get_f(x)而非f[x]
待到oi十一月,我花开后百花杀。