hdu1232詳解 暢通工程

2021-08-17 22:27:25 字數 551 閱讀 5503

這一題是並查集的題,關鍵就是找出根結點的數目,下面附上詳細的**和注釋講解:

(注釋中  祖先=根節點)

#includeint m,n,pre[1010],rank[1010];//pre陣列存關係(pre[a]==b表示a的父親是b),rank陣列存樹上有多少節點(rank[i]==j表示根節點為i的樹上有j個節點) 

void unit(int a)//初始化函式

int find(int x)//找祖先函式,find(a)的返回值即是a的祖先

return x;

}int un(int a,int b)//連線a,b到一棵樹上

else//b比a長,把a接到b樹上 }

int main()

int num=0;

for(i=1;i<=n;i++)//用乙個for迴圈得到祖先的數目

if(pre[i]==i)

num++;

printf("%d\n",num-1);//祖先數目-1就是需要修的路的數量 }

}

hdu1232 暢通工程

還是並查集,不過我覺得最後判斷最少路徑自己處理的麻煩了,得去看看大神 code id yueqiq prog numtri lang c include include include include include include include include include include i...

HDU 1232 暢通工程

題目大意 中文題 解題思路 最基礎的並查集,注意一點,雖然路徑優化了,但pre i 不一定就是最上級,所以最後查詢還得用find函式。該部落格詳盡的多 ac include include using namespace std int n,m,t1,t2,pre 1005 setse intfin...

HDU 1232 暢通工程

這題就是並查集的應用,我們可以假設n個城鎮之間皆無道路,那就要修建n 1條道路。每當我們已知兩個城鎮之間是連通的時候,我們就可以讓cnt 1,因為我們沒必要修建道路了。這樣的話我們就不用再壓縮路徑,判斷有多少的集合了。需要注意的一點是,對於並查集的連線,我們應該把它的祖先連線在一起,而不是把它們連線...