HDU 1232 暢通工程

2022-05-24 09:45:11 字數 1533 閱讀 7044

題目傳送門:

程式分析:

給你一些城市、城市之間的某些路,讓你求最少還要再建多少條路才能實現城市與城市之間兩兩相通。

需要注意的是,兩個城市之間可以有多條路,多條也當它一條處理。如果城市之間都沒有路,需要建的路

就是城市的個數減一。

解決方法:

利用並查集的特性,把城市之間有路的合併為乙個城市,最後判定有幾個城市或者有幾棵樹就可以了。

結果也就是城市(樹)數目減一,比如有三個城市就要有2條路來讓他們互通! 具體看**吧

view code

1 #include2

using

namespace

std;

3const

int max = 1000+10;4

intfar[max];

5int

sign[max];

6int

rank[max];

7int

map[max][max];89

void make_set(int

n)1016}

1718

int find_2(int

x)19

26while(i--)

2730

return

x;31}32

3334

int find(int

x)35

4041

void uni(int a, int

b)4256}

5758

intmain()

5971

for(int i=0; i)

7276

int ans=0;77

for(int j=1; j<=n; j++)

7882 cout<1

<

8485

return0;

86 }

view code

1 #include2

using

namespace

std;

3#define max 5000145

intp[max];

6bool

k[max];78

int find(int

pos)913

int uni(int x,int

y)14

2122

intmain()

2335

//輸入 合併

36for(int i=1;i<=m;i++)

3741

//標記

42for(int i=1;i<=n;i++)

4347

//統計

48int add=0;49

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

5054 printf("

%d\n

",add-1

);55}56

return0;

57 }

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