không d a trên t t ng c a các thu t toán tìm ki m theo chi u r ng ho c chi u sâu. ư ưở ế
Trong các thu t toán này, t i t ng b c c a quá trình xây d ng T luôn là m t cây, ch ướ
có đi u ki n v s đ nh c a T ph i đ n b c cu i cùng m i th a mãn. Còn trong ế ướ
thu t toán Kruskal, trong quá trình xây d ng T có th ch a là cây, nó ch th a mãn đi u ư
ki n không có chu trình.
[s a] Mô t
Gi s G liên thông có n đ nh. G i T là cây bao trùm s xây d ng.
1. Kh i t o: T lúc đ u là m t đ th r ng.
2. N u T đã g m đúng n-1 c nh c a G thì T là cây bao trùm c n tìm. K t thúc.ế ế
3. N u G còn ch a đ n-1 c nh, thì vì G liên thông, nên G có không ít h n n-1ế ư ơ
c nh, do đó còn các c nh c a G ch a thu c T. Trong các c nh c a G ch a ư ư
thu c T có các c nh không t o ra chu trình v i các c nh đã có trong T, Ch n
c nh v có tr ng s nh nh t trong các c nh y b sung (cùng v i các đ nh ch a ư
thu c T c a nó) vào T.
4. Quay l i 2.
M t vài tác gi có cách trình bày khác c a gi i thu t Kruskal, tuy b n ch t quá trình là
gi ng nhau
1. Kh i t o: T lúc đ u g m t t c các đ nh c a G và ch a có c nh nào,nh vây T ư ư
lúc đ u là m t r ng n cây,m i cây g m đúng m t đ nh.
2. N u T ch g m m t cây thì d ngế
3. N u T g m nhi u h n m t cây, ch n c nh nh nh t c a G có hai đ u mútế ơ
thu c hai cây khác nhau b sung vào T, khi đó hai cây đ c h p thành m t cây. ượ
4. Quay l i 2.
[s a] Gi
[s a] Phân tích
Khi l p trình cài đ t gi i thu t Kruskal có hai đi m m u ch t c n chú ý:
1. Trong m i l n l p ta ch n c nh có tr ng s nh nh t đ a vào T. ư
2. C nh đ c ch n đ a vào T ph i không t o thành chu trình v i các c nh đã có ượ ư
trong T.
V n đ th nh t đ c gi i quy t g n gi ng nh trong gi i thu t ượ ế ư Prim là t o
m t hàng đ i có u tiên trên danh sách các c nh. Tuy nhiên có th ngay t đ u ư
s p x p các c nh theo th t tăng d n c a tr ng s . ế
Đ gi i quy t v n đ th hai, ta quay l i chú ý r ng, khác v i gi i thu t ế Prim, t i m i
b c c a gi i thu t ướ Kruskal, t p các đ nh và các c nh đã đ c đ a vào T ch a là cây ượ ư ư
mà ch th a mã tính không chu trình. Nh v y t i m i b c T là m t r ng, T = ư ướ
.
Bây gi xét m t c nh e = (u,v) c a G ch a n m trong T có 3 kh năng x y ra: ư
1. C u,v ch a thu c T. Khi đó n u b sung ư ế e vào T thì không có chu trình, nh ngư
chính c nh e t o thành m t cây con m i.
2. M t đ nh ch ng h n u thu c T, còn đ nh kia v không thu c T. Vi c b sung
c nh e và đ nh v vào T (vào cây con ch a đ nh u) không t o ra chu trình.
3. C u,v đ u n m trong T. Khi đó
1. N u ếu,v n m trong cùng m t cây con Tk ta không th b sung canh e vào
T.
2. N u ếu,v n m trong hai cây con khác nhau thì có th b sung c nh e vào
T (hai đ nh u, v đã n m trong T không c n b sung, sau khi b sung hai
cây con s h p l i thành m t cây.
[s a] T ch c d li u
Gi s G=(V,E)là đ th vô h ng n đ nh, cho b ng danh sách k Ajd(u), ướ
. Các đ nh c a G đ c đánh s t 1 đ n n, nghiã là V=V[1..n];Ta cũng ượ ế
kí hi u Index(u) là ch s c a đ nh u trong m ng V.
Hàm tr ng s W(u,v) xác đ nh trên các c nh . V i m i c nh e=(u,v) ký
hi u e.x u, e.y=v là hai đ nh liên thu c v i c nh e.
Các bi n sau đ c đ a vào ế ượ ư
oHàng đ i Q c a các c nh x p theo th t tr ng s t nh đ n l n. ế ế
oV i m i cây con, hàm PARENTS(u) xác đ nh trên V, bi u di n ch s
c a đ nh cha c a đ nh u trong m t cây. Riêng đ nh g c u c a m i cây
hàm PARENTS(u)l u tr s đ nh trong cây v i d u âm.ư
[s a] Mã
Procedure Kruskal (G)
T = V;
Q =Sort(E)
/* T o n cây, m i cây g m m t đ nh*/
For each u of X do Parent(u):=-1;
m = |E|
For j:=1 to m do {
u:=NodeStart(Q(j)); V:=NodeEnd(Q(j))
If Find_tree(u)<>Find_tree(V) then
T:=T U Q[j];
Union(u,v;)
Ghi chú:
Th t c Find_set(u) tìm đ nh g c c a cây ch a đ nh u. (xem cây bi u di n t p
h p).
Th t c Union(u,v),ghép cây ch a v vào cây ch a u (xem cây bi u di n t p
h p).
L y t http://vi.wikipedia.org/wiki/C%C3%A2y_bao_tr%C3%B9m_nh%E1%BB
%8F_nh%E1%BA%A5t
Th lo i : Cây (c u trúc) | Bài toán th i gian đa th c | Gi i thu t lý thuy t đ th ế
-------------------------------------------------------------------------------
#include <iostream.h>
char Dinhdau[] ={‘a’,’a’,’a’,’b’,’b’,’c’, ’c’,’d’};
char Dinhcuoi[] ={‘b’,’c’,’d’,’c’,’e’,’d’, ’f’,’g’};
int Trongso[] ={10, 1, 10,5,10,4,2,10};
int n = sizeof(Trongso)/sizeof(int);
int CanhCay = 7;
int Cay[100] ;// canh thu may
char Dinh[] = {‘a’,’b’,’c’,….};
int TPLT[] = {1,2,3,4,5,6,7};
int SapXep(){
for (int i = 0; i<n-1; i++){
int min = i;
for (int j = i+1; j<n; j++){
if (Trongso[min]>Trongso[j]) min = j;
}
if (min !=i){
int tg = Trongso[i]; Trongso[i] = Trongso[min]; Trongso[min]=tg;
char ch = Dinhdau[i]; Dinhdau[i]= Dinhdau[min]; Dinhdau[min] = ch;
ch = Dinhcuoi[i]; Dinhcuoi [i]= Dinhcuoi [min]; Dinhcuoi [min] = ch;
}
}
//--------------------------------------------------
void HopTPLT(int TP1, int TP2){
for (int i = 0; i<n; i++)
if (TPLT[i]= =TP1) TPLT[i]= TP2);
}
//-------------------------------------------------------------
int F_TPLT(char ch){
for (int i = 0; i<n; i++)
if(Dinh[i]==ch) return TPLT[i];
}
//---------------------------------------------------------------
int main(){
int Canh = 0;
SapXep();
int i = 0;
while (Canh <CanhCay){
if (F_TPLT(Dinhdau[i]) != F_TPLT(Dinhcuoi[i])){
Cay[Canh] = min;
Canh +=1;
HopTPLT(Dinhdau[i], Dinhcuoi[i]);
}
}
//-----------------------------------------------------------------------
Đ TÀI TÌM CÂY TR NG L NG NH NH T B NG GI I THU T ƯỢ
KRUSCAL
MSĐT : NL1TH-025
Đ C T Đ TÀI
V n d ng các lý thuy t c b n v đ th đ cài đ t ch ng trình cho phép bi u di n ế ơ ươ
đ th , ki m tra tính liên thông và tìm cây có tr ng l ng nh nh t b ng gi i thu t ượ
Kruscal.
YÊU C U C A Đ TÀI
Yêu c u c b n c n đ t đ c : ơ ượ
Lý thuy t:ế
- Các thao tác c b n v đ h a.ơ
- Các khái ni m v đ th có h ng và đ th vô h ng ướ ướ
-Các cách bi u di n đ th , các ph ng pháp tìm ki m trên đ th (tìm theo chi u r ng ươ ế
và chi u sâu) và tính liên thông.
- Gi i thu t ki m tra tính liên thông và gi i thu t Kruscal tìm cây có tr ng l ng nh ượ
nh t.
-Nh ng c u trúc d li u c n thi t đ cài đ t ch ng trình. ế ươ
Ch ng trình: ươ
Ph i có nh ng ch c năng c b n sau: ơ
- C p nh t d li u v đ th .
- Bi u di n đ th trên màn hình.
- Ki m tra tính liên thông.
- Cho phép tìm cây có tr ng l ng nh nh t. ượ
MÔI TR NG CÀI Đ T :ƯỜ
Ngôn ng l p trình s d ng : Pascal, C, C ++
TÀI LI U THAM KH O :
1. Bài gi ng: Lý Thuy t Đ th - Phan T n Tài ế
2. Lý Thuy t Đ Th - PTs. Nguy n Cam & PTs. Chu Đ c Khánh.ế
3. Tóan r i r c – Nguy n Đ c Nghĩa & Nguy n Tô Thành
4. “Tóan r i r c ng d ng trong tin h c” d ch t quy n Discrete Methamatíc and Its
Application – Mc Graw Hill.
5. Data Structures and Algorithms - A. Aho, J. Ullman
6. Ch ng trình = C u trúc d li u + Gi i thu t – Wirthươ
----------------------------------------------------------------
#include <iostream.h>
char Dinhdau[] ={'a','a' ,'a','b','b','c','c','d','e','e'};
char Dinhcuoi[] ={'b','e','f','c','e','d','e','e','f','g'};
int Trongso[] ={3,5,7,10,12,12,13,16,16,16};
int n = sizeof(Trongso)/sizeof(int);
int CanhCay = 9;
int Cay[100] ;
char Dinh[] = {'a','b','c','d','e','f'}; // sao lai char dinh la sao a
int TPLT[] = {1,2,3,4,5,6,7,8,9,10}; // cai TPLT nay la cai gi a
int SapXep()
{
for ( int i = 0; i<n-1; i++)
{
int min = i;
for (int j = i+1; j<n; j++)