WC:http://www.dapping.com/blog/user1/7/archives/2005/279.html class UFSet { public: long parent[MAX]; void makeSet(); long find(long); void unionSet(long, long); }; void UFSet::makeSet() { memset(parent, -1, sizeof(parent)); } long UFSet::find(long x) { if(parent[x] == -1) { return x; } else { parent[x] = find(parent[x]); return parent[x]; } } void UFSet::unionSet(long x, long y) { long pX = find(x); long pY = find(y); if(pX != pY) { parent[pX] = pY; } } 习习:http://waveform.bokee.com/viewdiary.11494840.html #include <vector> class UFSet { public: std::vector<int> parent; UFSet(size_t count) { makeSet(count); } void makeSet(size_t count) { parent.assign(count, -1); } int find(int x)//collapsing find { int temp,retval=x; while(parent[retval]>=0) retval=parent[retval]; while(x!=retval) { temp=parent[x]; parent[x]=retval; x=temp; } return retval; } void unionSet(int x, int y) { int px=find(x); int py=find(y); if(px!=py) parent[px]=py; } void weightedUnion(int x, int y) { int px=find(x); int py=find(y); if(px==py) return; int temp=parent[px]+parent[py]; if(parent[px]<parent[py]) { parent[py]=px; parent[px]=temp; } else { parent[px]=py; parent[py]=temp; } } }; 另: 主要就是2个操作啦... (p[I]表示一个节点的父亲节点,p[I]=0表示它是树根,s[I]表示一个节点有多少个子孙节点,只有p[I]=0时,s[I]有意义。) 查找根节点 (顺便压缩路径...暴拽...) Function find(k:integer):integer;(查找k点所属集合的根节点。) Begin If p[k]>0 then Begin P[k]:=find(p[k]); Find:=p[k]; End Else Find:=k; End. 合并.... Procedure merge(a,b:integer);(合并a,b点所属的根集合。) Var x,y:integer; Begin X:=find(a); y:=find(b); If x=y then exit; If s[x]>s[y] then Begin P[y]:=x; S[x]:=s[x]+s[y]; End Else Begin P[x]:=y; S[y]:=s[y]+s[x]; End; End.