題目要求有兩個條件:1.在給定圖中無環
2.給定的圖有且僅有有1個連通分支
判斷環:在輸入時判斷點a點b是否有相同的根節點,有相同根節點再加一條直接連通的邊就有環.
判斷連通分支數:判斷有幾個跟節點 if(father[i]==i)
view code
1 #include 2using
namespace
std;
3const
int max = 100000 + 100;4
intfather[max];
5int
rank1[max];
6int
sign[max];
7void make_set(int x)//
初始化8
1213
int find_set(int x)//
找根節點
1421
for(i;i>=1;i--)
2225
return
x;26}27
2829
void union(int x,int y)//
合併30
37if(rank1[x] >rank1[y])
3841
else
if(rank1[x]
4245
else
if(rank1[x] ==rank1[y])
4650}51
52int
main()53;
59for(i=1;i<=max-1;i++)
6063
for(i=1;i<=max-1;i++)
6471
if(a == -1 && b == -1)72
75 used[a] = 1
;76 used[b] = 1;77
int ra =find_set(a);
78int rb =find_set(b);
79if(ra ==rb)
8083
union(a,b);84}
85int sum=0;86
for(i=1;i<=max-1;i++)
8792}93
if(sum > 1 || mark == 1)94
97else
98101
102}
103return0;
104 }
HDU ACM 1272 小希迷宮(並查集)
題目大意 把是房間之間有路的房間編碼放到一組,n個編碼可以分成幾組,並判斷是否滿足 條件一 任何兩個房間只能有一條路連線 條件二 所有房間之間都有路連線 題目解析 運用並查集把有關係的人合併到一組,最後遍歷陣列father i 檢視i根結點是否為他自己 錯誤分析 1.初始化的函式init 中i in...
hduoj1272 小希的迷宮
題目是判斷給定的圖是否存在環與孤立的點。使用並查集即可判斷,如果存在環路,則必有一條邊使得當這條邊的兩端的頂點的根節點屬於同乙個集合,因而在合併操作的時候判斷這條邊的兩個節點的根節點是否屬於同乙個集合。孤立的點,則會出現,合併的最後仍至少有兩個點的根節點為自身。poj的1308和此題類似 如下 in...
hdoj 1272 小希的迷宮
題目 關鍵點 1.特別小心輸入的格式,這個比較糾結。2.題目的最關鍵點 1 所有點的根節點都相同 即下面的count 1 2 輸入路徑不存在回來,這裡用flag來標記回來 即構成迴路,flag 1 3.注意find3 int x 這裡用路徑壓縮的話,速度會快很多 用空間來換時間 ac include...