按秩合并 && 撤销
int fa[nsz],dep[nsz];int stk[nsz][2],top=0;void init(){rep(i,1,n)fa[i]=i,dep[i]=1;}int find(int p){return p==fa[p]?p:find(fa[p]);}int iscon(int a,int b){return find(a)==find(b);}void merge(int a,int b){ a=find(a),b=find(b); if(a==b)return; if(dep[a]
路径压缩
大体同前, find函数略有不同.
不能撤销.
int find(int p){return p==fa[p]?p:p=find(fa[p]);}