并查集模板
int set[100007]; //父节点,如果set[i]=i,则i元素无父节点 bool vis[100007]; void init(int n) { int i; for(i=1;i<=n;++i) { set[i]=i; vis[i]=0; } } int find(int x) { return set[x]=set[x]==x?x:find(set[x]); //压缩路径之find } void merge(int a,int b) //合并 { int sa=find(a); int sb=find(b); if(sa!=sb) set[sa]=sb; }