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;}