HDU 1232 暢通工程

2022-03-26 23:34:36 字數 578 閱讀 2121

題意很清楚,我們來分析下例子:第一行告訴你,一共有4個點,2條路。下面兩行告訴你,1、3之間有條路,4、3之間有條路。那麼整幅圖就被分成了1-3-4和2兩部分。只要再加一條路,把2和其他任意乙個點連起來,暢通工程就實現了,那麼這個這組資料的輸出結果就是1。

那該怎麼辦呢?可以運用上週學的並查集啊!給每個父陣列乙個初值-1,代表尚未與其他路接通,每連通乙個路,便將-1置去,因此和普通並查集不同的地方為初始化應為如下:

for(int i=0;i<=n;i++)

pre[i]=-1;

此時find函式應為:

int find(int

x)void uion(int x,int

y)int

main()

int sum=0

;

for(int i=0;i<=n;i++)

if(pre[i]==-1

) sum++;

printf(

"%d\n

",sum-2);}

return0;

}

view code

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