Hdu1232暢通工程 解題報告

2021-08-22 16:46:54 字數 711 閱讀 6854

並查集:將編號分別為1到n的n個物件劃分為不相交集合,在每個集合中,選擇其中某個元素代表所在集合。主要有兩個操作:(1)合併兩個集合,(2)查詢某元素屬於哪個集合。下面是利用並查集求解hdu 1232 暢通工程(比用dfs,bfs搜尋大大提高了時間效率。

#include #include using namespace std;

vector parents;

int findset(int i)//if (parents[i]==i) then i is root;else if (parents[i]==j(j!=i)) then j is root.

int k=i;

while(k != root) //path compression

return root;

}void unionset(int a, int b)//union a,b to the small parent

for(i=0;i>a>>b;

unionset(a,b);

}int cntroot=0;

for(i=1;i<=n;i++) }

cout << cntroot-1 << endl;

return true;

}int main()

說明:while(k != root) //把i開始結點的根修改為找到的根root,路徑壓縮便於提高效率

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,因為我們沒必要修建道路了。這樣的話我們就不用再壓縮路徑,判斷有多少的集合了。需要注意的一點是,對於並查集的連線,我們應該把它的祖先連線在一起,而不是把它們連線...