題目傳送門:
程式分析:
給你一些城市、城市之間的某些路,讓你求最少還要再建多少條路才能實現城市與城市之間兩兩相通。
需要注意的是,兩個城市之間可以有多條路,多條也當它一條處理。如果城市之間都沒有路,需要建的路
就是城市的個數減一。
解決方法:
利用並查集的特性,把城市之間有路的合併為乙個城市,最後判定有幾個城市或者有幾棵樹就可以了。
結果也就是城市(樹)數目減一,比如有三個城市就要有2條路來讓他們互通! 具體看**吧
view code
1 #include2using
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 #include2using
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,因為我們沒必要修建道路了。這樣的話我們就不用再壓縮路徑,判斷有多少的集合了。需要注意的一點是,對於並查集的連線,我們應該把它的祖先連線在一起,而不是把它們連線...