問題描述:圖的動態連通性問題,要求能夠新增連線,判斷一對物件是否相連等
解決思路:若給出的兩個物件連通,則使兩者的id值置為相同,判斷是否連通時也只用判斷值是否相同即可。
**實現:
class
quick_find
}//find the root of p_id[i]
intfind
(int
*p_id,
int i)
//the function of connected
bool
connected
(int
*p_id,
int x,
int y)
//the function of union
void
union_num
(int
*p_id,
int n,
int x,
int y)
} count--;}
}//cout the cnt
void
display()
};
檢驗一下:
int
main()
cout << endl;
f.union_num
(p_id, n,4,
3); f.
union_num
(p_id, n,3,
8); f.
union_num
(p_id, n,6,
5); f.
union_num
(p_id, n,9,
4); f.
union_num
(p_id, n,2,
1); f.
union_num
(p_id, n,8,
9); f.
union_num
(p_id, n,5,
0); f.
union_num
(p_id, n,7,
2); f.
union_num
(p_id, n,6,
1); f.
union_num
(p_id, n,1,
0); f.
union_num
(p_id, n,6,
7);for
(int i =
0; i < n; i++
) cout << endl;
f.display()
;system
("pause");
return0;
}
解決思路:由於在quick find中,每次連通時都要遍歷整個陣列修改它的值,這樣是非常浪費時間的,為了提公升速度,我們在連線時將其id值設定為另乙個元素,形成鏈結,在進行下一次連線時,尋找其鏈結的根再連起來,節省時間。
class
quick_union
}//find the root of num
intfind
(int
*p_id,
int num)
//judge if two components are connected
bool
connected
(int
*p_id,
int x,
int y)
//connect two components
void
union_id
(int
*p_id,
int x,
int y)
}//cout the count of connected components
void
display()
};
寫主函式實現一下:
int
main()
cout << endl;
f.union_id
(p_id,4,
3); f.
union_id
(p_id ,3,
8); f.
union_id
(p_id,6,
5); f.
union_id
(p_id,9,
4); f.
union_id
(p_id,2,
1); f.
union_id
(p_id ,8,
9); f.
union_id
(p_id,5,
0); f.
union_id
(p_id,7,
2); f.
union_id
(p_id,6,
1); f.
union_id
(p_id,1,
0); f.
union_id
(p_id,6,
7);for
(int i =
0; i < n; i++
) cout << endl;
f.display()
;system
("pause");
return0;
}
解決思路:這時出現了新的問題,quick union有一種很壞的情況,就是將一棵大樹和小樹相連時,若不經過判斷,最後會形成一顆「**」的樹,因此引入加權演算法,簡單的新增乙個size陣列記錄樹中的節點數,一比較就知道哪個小比較好連啦。
class
weighted_quick_union
}//find the root of numbers
intfind
(int
*p_id,
int num)
//connect two numbers' root
void
union_num
(int
*p_id,
int x,
int y)
else
count = count -1;
}}//judge two numbers
bool
connected
(int
*p_id,
int x,
int y)
//cout the count of connected components
void
display()
};
實現一下:
int
main()
cout << endl;
f.union_num
(p_id,4,
3); f.
union_num
(p_id,3,
8); f.
union_num
(p_id,6,
5); f.
union_num
(p_id,9,
4); f.
union_num
(p_id,2,
1); f.
union_num
(p_id,5,
0); f.
union_num
(p_id,7,
2); f.
union_num
(p_id,6,
1);for
(int i =
0; i < n; i++
) cout << endl;
f.display()
;system
("pause");
return0;
}
union find演算法的研究
三種union find演算法的效能特點演算法 建構函式 union find quick find演算法nn 1quick union演算法 n樹的高度 樹的高度 加權quick union演算法 nlgn lgnpublic intfind int p public void union int...
四 union find演算法
問題 問題總結 就是輸入乙個整數對代表兩個融點 也就是物件,融點是術語 如果兩個融點未連通,則將它們連在一起 呼叫union方法,下面黑色的部分 並列印 如果兩個融點已經連通則處理下一對資料 下圖灰色的部分,什麼也不幹 過程如下 設計乙個資料結構來儲存程式已知的所有整數對的足夠多的資訊,並用它們來判...
演算法學習 Union Find演算法
union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...