涓嶇浉浜ら泦鍚堟暟鎹粨鏋勪繚鎸佷竴緇勪笉鐩鎬氦鐨勫姩鎬侀泦鍚坰={s1,s2,...}錛屾瘡涓泦鍚堥氳繃涓涓唬琛ㄦ潵璇嗗埆錛屼唬琛ㄦ槸闆嗗悎涓殑鏌愪釜鍏冪礌銆?br>
涓嶇浉浜ら泦鍚堢殑搴旂敤杈冧負(fù)緇忓吀鐨勬槸鍒ゆ柇浼?xì)涓嶄細(xì)鏋勬垚杩為氬浘錛岀敤浜庢渶灝忕敓鎴愭爲(wèi)鐨凨ruskal綆楁硶銆?br>
鍩烘湰鎿嶄綔鏈夛細(xì)
make_set(x):寤虹珛涓涓柊鐨勯泦鍚堬紝鍏跺敮涓鎴愬憳?shù)篃灏辨槸浠h〃湄?fù)X銆備唬琛╔閮戒笉鍚岋紝璧峰垵鍚勪釜闆嗗悎鑲畾鏄笉鐩鎬氦鐨勩?br>
union(x,y):灝嗗寘鍚玿,y鍏冪礌鐨勯泦鍚堝悎騫朵負(fù)涓涓柊鐨勯泦鍚堬紝姝ゆ椂瑕侀夊嚭涓涓柊鐨勪唬琛ㄦ潵浠h〃榪欎釜闆嗗悎錛屽茍涓斿皢鍘熷厛鐨勫寘鍚玿,y鍏冪礌鐨勯泦鍚堝垹闄ゆ帀錛屽皢鏂伴泦鍚堝姞鍏ュ埌S涓?br>
find_set(x):榪斿洖鍖呭惈x鍏冪礌鐨勯泦鍚堢殑閭d釜浠h〃銆?br>
緇間笂鎵榪幫紝濡備綍鏉ラ夋嫨鏂伴泦鍚堢殑浠h〃鍜宖ind_set(x)灝嗘槸鎴戜滑瑕佽冭檻鍒板懆瀵嗙殑闂銆?br>
鎺ヤ笅鏉ユ垜浠粙緇嶆寜縐╁悎騫跺拰璺緞鍘嬬緝鍚彂寮忕殑鏂規(guī)硶鏉ヨВ鍐寵繖涓棶棰?br>
鐪嬩唬鐮佸垎鏋愬惂錛?/p>
#define N 1000
int p[N],rank[N];
void make_set(int x)
{
p[x]=x;
rank[x]=0;
}
void union(int x,int y)
{
if(rank[x]>rank[y])
p[y]=x;
else if(rank[x]<rank[y])
p[x]=y;
else if(rank[x]==rank[y]){
p[x]=y;
rank[y]++;
}
}
int find_set(int x)
{
if(x!=p[x])
p[x]=find_set(p[x]);
return p[x];
}
寤鴻璇昏呭ソ濂藉嚑涓緥瀛愭潵鍒嗘瀽涓嬪挴銆傘傘?br>

]]>