並查集(集合的合併與查詢)
其中主要有三個函式:init();初始化乙個並查集,主要是根據題目需要建立乙個原始的點集,因為還沒有處理點與點的關係,初始化每個點的父親結點為本身。
find();找到並返回某個點的父親結點,以及優化路徑。
unionset();處理點與點的關係。如圖1
(1)在處理b與a的關係時,b與a的根節點不同,而b與a又屬於同乙個集合,所以將b指向a,p[b]=a,即a為b的父親結點。這時a的根節點為a,b的根節點也為a。在邏輯上將b與a連線起來 。為同乙個集合裡的元素。
(2)又如在處理d與b時,d的根節點為d,為b的根節點為a。而d與b又是同乙個集合裡的元素。所以將d指向b的根節點a。
(3)而在判斷d與g是否為同一集合的元素時,只需要查詢它們的根節點是否相同,由圖可以看出,它們 的根節點分別為a和e,所以它們不在同一集合。
hdu 1232通暢工程
(1)題意以及輸入
(2)輸出
解法:由題意可以知道,第一行給出有n個城市和m條道路。對這些道路進行處理可以發現,如果n個城市可分為k個相互聯通的部分,那麼只需要k-1條路將這些部分聯通。所以這道題求出將這些資料用並查集函式進行處理後存在多少個根節點即可得解。
**:
#include#include#include#include#includeusing namespace std;
const int maxn=1020;
int n,p[maxn],r[maxn],t[maxn];
void init()
return ;
}int find(int x)
return p[x];
}void unionset(int x,int y)
}return ;
}int main()
{ int m,k,c1,c2;
while(~scanf("%d",&n))
{if(n==0)
break;
init();
scanf("%d",&m);
for(int i=0; i
HDU 1232(並查集學習筆記)
原來在練最小生成樹的時候,用prim寫過這個題目。後面發現這個題用並查集做更好。不管是時間還是占用記憶體都是大大優化了。並查集實現 每個集合用一棵 有根樹 表示 定義陣列 set 1.n set i i 則i表示本集合,並是集合對應樹的根 set i j,j i,則 j 是 i 的父節點.程式 in...
HDU 1232 暢通工程(並查集)
題意 有n個城鎮,已經現在已經有m條道路,每條道路連線兩個城鎮 可以重複連線 目標是使任意兩個城鎮間都可以實現交通 不一定有直接的道路相連,只要互相間接通過道路可達即可 求最少還需要建設多少條道路。本題看上去像圖的連通性問題,和圖論有關,但是其實不必用圖論的那些演算法解決。說這話是因為這是並查集配的...
並查集 HDU 1232 暢通工程
problem description 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?input 測試輸入包含若干測試用例。...