You are on page 1of 161

CHNG 7.

TH V CY
7.1. Mt s khi nim
7.2. ng i, chu trnh, th lin thng
7.3. Mt s dng th c bit
7.4. Biu din th trn my tnh
7.5. Cc thut ton tm kim trn th
7.6. Tm ng i ngn nht
7.7. Cy v ng dng
7.8. Bi tp

1
7.1. MT S KHI NIM (1/17)
Gii thiu chung:
L thuyt th c xut t th k 18, bt u t bi bo
ca Euler cng b nm 1736 lin quan n li gii bi ton ni
ting v cc cy cu Konigsberg.
Cho ti nay, mi quan tm n l thuyt th vn khng h suy
gim.
L do: phm vi ng dng ht sc rng ri ca th trong rt
nhiu lnh vc khc nhau, bao gm:
Trong tin hc,
Ho hc,
Vn tr hc,
K thut in,
Ngn ng
Kinh t
2
7.1. MT S KHI NIM(2/17)
nh ngha 7.1.1: th (Graph) l mt cu trc d liu ri rc
bao gm cc nh v cc cnh ni cc cp nh ny. Chng ta
phn bit th thng qua kiu v s lng nh, s lng cnh
ni gia cc cp nh ca th, im u im cui ca mi cnh.
3
7.1. MT S KHI NIM
nh ngha 7.1.2. th v
hng hoc th G l mt cp
c th tG:=(V, E), trong :
V: tp cc nh hoc nt.
E: tp cc cp khng th t
cha cc nh phn bit, c
gi l cnh. Hai nh thuc
mt cnh c gi l
cc nh u cui ca cnh
.

4
nh ngha 7.1.3. th c
hng G l mt cp c th
t G:=(V, A), trong
V: tp cc nh hoc nt.
A: tp cc cp c th t cha
cc nh, c gi l cung.
Cung e = (x, y) c
hng t x ti y; x c gi l
im u v y c gi
l im cui ca cung.
7.1. MT S KHI NIM
nh ngha 7.1.4. n th
v hng G =(V,E) l th v
hng m gia hai nh ch c
ti a mt cnh.

5
nh ngha 7.1.5. a th
v hng G=(V,E) l th v
hng m gia hai nh c th c
nhiu hn mt cnh.
7.1. MT S KHI NIM
nh ngha 7.1.6. n th c
hng G = <V, A> l th c
hng, trong , nu v
1
v v
2
l
hai nh th th ch c php
c ti a mt cung (v
1
, v
2
).

6
nh ngha 7.1.7. a th c
hng G = <V, A> l th c
hng, trong nu v
1
v v
2
l 2
nh ca th th c th c nhiu
cung (v
1
,v
2
). Hai cung e
1
, e
2

tng
ng vi cng mt cp nh c gi
l cung lp.
7.1. MT S KHI NIM
nh ngha 7.1.8:
Gi th v hng G=(V, E) l th v hng m cnh l
cp khng c th t gm hai phn t (hai phn t khng nht
thit phi khc nhau) trong V.
Cnh e c gi l khuyn nu c dng e =(u, u), trong u l
nh no thuc V.

7
7.1. MT S KHI NIM

Bng phn bit cc loi th
8
7.1. MT S KHI NIM
nh ngha 7.1.9:
Hai nh u v v ca th v hng G =<V, E> c gi
l k nhau nu (u,v) l cnh thuc th G.
Nu e =(u, v) l cnh ca th G th ta ni cnh ny
lin thuc vi hai nh u v v, hoc ta ni cnh e ni
nh u vi nh v, ng thi cc nh u v v s c gi
l nh u ca cnh (u,v).
nh ngha 7.1.10:
Ta gi bc ca nh v trong th v hng l s cnh
lin thuc vi n v k hiu l deg(v).
9
7.1. MT S KHI NIM (12/17)
V d:
Cho th v hng:



Ta c:
deg(a) = 2, deg(b) =deg(c) = deg(f) = 4, deg(e) = 3, deg(d) = 1,
deg(g)=0.
nh bc 0 c gi l nh c lp.
nh bc 1 c gi l nh treo.
Trong v d trn, nh g l nh c lp, nh d l nh treo
10
7.1. MT S KHI NIM (13/17)
11
nh l 7.1.1:
Gi s G = <V, E> l th v hng vi m cnh. Khi :
2m = deg(v)
H qu:
Trong mt th v hng, s cc nh bc l l mt s
chn.
7.1. MT S KHI NIM (15/17)
nh ngha 7.1.11:
Nu e=(u,v) l cung ca th c hng G th ta ni hai nh u
v v l k nhau, v ni cung (u, v) ni nh u vi nh v hoc
cng ni cung ny i ra khi nh u v i vo nh v. nh u (v) s
c gi l nh u (cui) ca cung (u,v).

nh ngha 7.1.12:
Ta gi bn bc ra (bn bc vo) ca nh v trong th c hng
G l s cung ca th i ra khi n (i vo n) v k hiu l
deg
+
(v) v deg
-
(v).
12
7.1. MT S KHI NIM (16/17)
V d:
Cho th c hng:




Ta c:
deg
-
(a) = 1, deg
-
(b) = 2, deg
-
(c) = 2, deg
-
(d) = 2, deg
-
(e) = 2.
deg
+
(a) = 3, deg
+
(b) = 1, deg
+
(c) = 1, deg
+
(d) = 2, deg
+
(e) = 2.


13
7.1. MT S KHI NIM
14
nh l 7.1.2:
Gi s G = (V, A) l th c hng. Khi :
deg
+
(v) = deg
-
(v) = |A|
Ch
Nhiu tnh cht c th c hng khng ph thuc vo
hng trn cc cnh ca n.
th v hng nhn c t th c hng bng
cch b qua hng ca cc cnh c gi l th v
hng tng ng ( th v hng nn) ca th c
hng cho.
7.2. NG I. CHU TRNH. TH LIN THNG (1/6)
nh ngha 7.2.1:
ng i di n t nh u n nh v trn th v hng
G=<V,E> l dy:
x
0
, x
1
,..., x
n-1
, x
n


trong n l s nguyn dng, x
0
=u, x
n
=v, (x
i
, x
i+1
)E, i =0, 1,
2,..., n-1.
ng i nh trn cn c th biu din thnh dy cc cnh:
(x
0
, x
1
), (x
1
,x
2
),..., (x
n-1
, x
n
).
nh u l nh u, nh v l nh cui ca ng i.
ng i c nh u trng vi nh cui (u=v) c gi l chu trnh.
ng i hay chu trnh c gi l n nu nh khng c cnh no
lp li.
15
7.2. NG I. CHU TRNH. TH LIN THNG (2/6)
V d:
Tm cc ng i, chu trnh trong
th v hng nh trong hnh bn.

Ta c:
a, d, c, f, e l ng i n di 4.
d, e, c, a khng l ng i v (e,c)
khng phi l cnh ca th.
Dy b, c, f, e, b l chu trnh di 4.
ng i a, b, e, d, a, b c di 5
khng phi l ng i n v cnh
(a,b) c mt hai ln.
16
7.2. NG I. CHU TRNH. TH LIN THNG (3/6)
nh ngha 7.2.2:
ng i di n t nh u n nh v trong th c hng
G=<V,A> l dy:
x
0
, x
1
,..., x
n


trong , n l s nguyn dng, u = x
0
, v = x
n
, (x
i
, x
i+1
) A.
ng i nh trn c th biu din thnh dy cc cung:
(x
0
, x
1
), (x
1
, x
2
),..., (x
n-1
, x
n
).
nh u c gi l nh u, nh v c gi l nh cui ca ng i.
ng i c nh u trng vi nh cui (u=v) c gi l mt chu
trnh.
ng i hay chu trnh c gi l n nu nh khng c hai cnh
no lp li.
17
7.2. NG I. CHU TRNH. TH LIN THNG (4/6)
nh ngha 7.2.3:
th v hng c gi l lin thng nu lun tm c
ng i gia hai nh bt k ca n.
nh ngha 7.2.4:
th H = (W, F) c gi l th con ca th G = (V, E) nu
W _ V, F _ E.
th con lin thng ca G c gi l thnh phn lin thng.
18
7.2. NG I. CHU TRNH. TH LIN THNG (5/6)
V d:
Cho th G nh hnh
bn.
S thnh phn lin thng
ca G l 3 (c th tch
thnh 3 th con lin
thng)
Thnh phn lin thng
th nht gm cc nh 1,
2, 3, 4, 6, 7.
Thnh phn lin thng th
hai gm cc nh 5, 8, 9,
10.
Thnh phn lin thng th
ba gm cc nh 11, 12,
13
19
7.2. NG I. CHU TRNH. TH LIN THNG (6/6)
nh ngha 7.2.5:
th c hng c
gi l lin thng mnh
nu lun c mt ng
i ni hai nh bt k ca
th.
th c hng c
gi l lin thng yu nu
th v hng tng
ng vi n l th v
hng lin thng.
20
- th G hnh di l lin thng mnh.
- th H l lin thng yu v khng l
lin thng mnh, v khng ng i ni
t a n cc nh khc.
7.3. MT S DNG TH N C BIT (1/6)
7.3.1: th y
th y n nh, k hiu l K
n
l mt n th cha
ng 1 cnh ni mi cp nh phn bit.
V d v th y :

21
Cc th K
n
,
7.3. MT S DNG TH N C BIT (2/6)
7.3.2: Chu trnh ( th vng)
Chu trnh C
n
, n > 3 l mt th c n nh v
1
, v
2
, , v
n
v n
cnh (v
1
, v
2
), (v
2
, v
3
), , (v
n-1
, v
n
), (v
n
, v
1
)
V d v th vng:

22
Cc th C
n
, 3
7.3. MT S DNG TH N C BIT (3/6)
7.3.3: th bnh xe
Khi thm 1 nh vo chu trnh C
n
vi n>3 v ni nh ny
vi mi mt nh ca C
n
bng nhng cnh mi, ta s nhn
c th hnh bnh xe, k hiu W
n
.
V d v th bnh xe:

23
Cc th W
n
, 3
7.3. MT S DNG TH N C BIT (4/6)
7.3.4: th khi n chiu
th khi n chiu (cc khi n chiu) k hiu l Q
n
, l cc th c 2
n
nh mi nh biu din bng xu nh phn di n. Hai nh l lin k
nu v ch nu cc xu nh phn biu din chng khc nhau ng 1 bit.
V d v th khi n chiu:

24
Cc th Q
n
, 1
7.3. MT S DNG TH N C BIT (5/6)
7.3.5: th phn i ( th hai pha)
Mt th n G c gi l th phn i nu tp cc nh V c th
phn thnh 2 tp con khng rng ri nhau V
1
v V
2
sao cho mi cnh
ca th ch ni mt nh ca V
1
vi mt nh ca V
2
.
V d v th phn i:

25
S phn i ca th C
6
7.3. MT S DNG TH N C BIT (6/6)
7.3.6: th phn i y ( th hai pha y )
th phn i y K
m,n
l th c tp nh c phn thnh hai
tp con tng ng c m nh v n nh v c mt cnh gia hai nh
khi v ch khi mt nh thuc tp con ny v nh th hai thuc tp con
kia.
V d v th phn i y :

26
Mt s th phn i y K
m,n
7.4. BIU DIN TH TRN MY TNH (1/16)
lu tr th v thc hin cc thut ton khc nhau, ta cn phi biu
din th trn my tnh, ng thi s dng nhng cu trc d liu thch
hp m t th. Vic chn cu trc d liu no biu din th c
tc ng rt ln n hiu qu thut ton.
Trong l thuyt th, c mt s phng php biu din th c
xem xt:
1. Ma trn k, ma trn trng s.
2. Danh sch cnh (cung).
3. Danh sch k.
4. Ma trn lin thuc.
27
7.4. BIU DIN TH TRN MY TNH (2/16)
7.4.1. Ma trn k, ma trn trng s (2/6)
Xt n th v hng G = (V, E)
V = (1, 2, ... , n)
E = (e
1
, e
2
, ..., e
n
)
Ma trn k biu din th G l ma trn 0 1 vi cc phn
t c xc nh nh sau:
28
1
0
neu (i,j) E
neu (i,j) E
ij
a
e

=

e

7.4. BIU DIN TH TRN MY TNH (3/16)


7.4.1. Ma trn k, ma trn trng s (2/6)
V d v ma trn k ca th v hng G sau:

29
7.4. BIU DIN TH TRN MY TNH (4/16)
30
7.4.1. Ma trn k, ma trn trng s
Mt s tnh cht ca ma trn k:
Ma trn k ca th v hng l ma trn i xng
Tng cc phn t theo dng i (ct j) ca ma trn k chnh
bng bc nh i (nh j).
Phn t ca ma trn tch A
p
= A.A...A(p ln) cho ta bit s
ng i khc nhau t nh i n nh j qua p 1 nh
trung gian
7.4. BIU DIN TH TRN MY TNH (4/16)
31
7.4.1. Ma trn k, ma trn trng s
Trong mt s bi ton, mi cnh e = (u,v) ca th c gn
mt gi tr c(e) no c gi l trng s ( di) ca cnh e.
th trong trng hp ny c gi l th c trng s
biu din th n c trng s, xy dng ma trn tng t,
vi cc phn t ca ma trn c xc nh nh sau.



Ma trn nh trn gi l ma trn trng s
Gi tr c th nhn gi tr 0 hoc + hoc - ty thuc tng bi
ton c th.


c(i,j) neu (i,j) E
neu (i,j) E
ij
c
u
e
=

e

7.4. BIU DIN TH TRN MY TNH (6/16)


7.4.1. Ma trn k, ma trn trng s (5/6)
V d v ma trn k ca th v hng c trng s:

32
6
3 5
9
8
7
6
3
7.4. BIU DIN TH TRN MY TNH (7/16)
7.4.1. Ma trn k, ma trn trng s (6/6)
Mt s nhn xt:
u im: phng php biu din th bng ma trn k
(hoc ma trn trng s) l ta d dng tr li c cu hi: Hai
nh u, v c k nhau trn th hay khng v chng ta ch mt
ng mt php so snh.
Nhc im: phng php biu din ny khng quan tm
ti s cnh, lun mt n
2
n v b nh lu tr th.
33
7.4. BIU DIN TH TRN MY TNH (8/16)
7.4.2. Danh sch cnh (cung) (1/4)
Trong trng hp th tha ( th c s cnh m 6n), ngi ta
thng biu din th di dng danh sch cnh.
Trong php biu din ny, lu tr danh sch tt c cc cnh (cung) ca
th v hng (c hng).
Mi cnh (cung) e(x, y) c tng ng vi hai bin dau[e], cuoi[e].
Nhn xt:
Vi phng php ny, cn 2m n v b nh.
Nhc im: nhn bit nhng cnh no k vi cnh no, cn m php so
snh trong khi duyt qua tt c m cnh (cung) ca th.
Nu l th c trng s, cn thm m n v b nh lu tr trng s ca cc
cnh.
34
7.4. BIU DIN TH TRN MY TNH (9/16)
7.4.2. Danh sch cnh (cung) (2/4)
V d 1 v danh sch cnh (cung):
35
7.4. BIU DIN TH TRN MY TNH (10/16)
7.4.2. Danh sch cnh (cung) (3/4)
V d 2 v danh sch cnh (cung):
36
7.4. BIU DIN TH TRN MY TNH (11/16)
7.4.2. Danh sch cnh (cung) (4/4)
V d 3 v danh sch cnh (cung):
37
6
3 5
9
8
7
6
3
7.4. BIU DIN TH TRN MY TNH (12/16)
7.4.3. Danh sch k (1/3)
Bn cnh , c th biu din th bng danh sch k.
Trong biu din ny, vi mi nh v ca th lu tr danh sch cc
nh k vi n m ta k hiu l Ke(v), hay:
Ke(v) = { u V: (u, v) E}
Vi cch biu din ny, mi nh v ca th, thng s dng danh
sch tt c cc nh k vi n v c k hiu l List(v).
biu din List(v), ta c th dng cc kiu d liu kiu tp hp,
mng hoc danh sch lin kt.
38
7.4. BIU DIN TH TRN MY TNH (13/16)
7.4.3. Danh sch k (2/3)
V d v danh sch k:
39
7.4. BIU DIN TH TRN MY TNH (14/16)
7.4.3. Danh sch k (3/3)
V d v danh sch k:
40
7.4. BIU DIN TH TRN MY TNH (15/16)
41
7.4.4. Ma trn lin thuc
Xt n th v hng G = (V, E)
V = (1, 2, ... , n)
E = (e
1
, e
2
, ..., e
n
)
Ma trn lin thuc biu din th G l ma trn M vi cc
phn t c xc nh nh sau:
1
0

neu canh e noi vi nh i
neu canh e khong noi vi nh i
j
ij
j
m

7.4. BIU DIN TH TRN MY TNH (16/16)


7.4.4. Ma trn lin thuc (2/2)
V d v ma trn lin thuc:
42
7.5. CC THUT TON TM KIM TRN TH (1/62)
Phn 7.5 gii thiu mt s vn :
7.5.1. Thut ton tm kim theo chiu su trn th.
7.5.2. Thut ton tm kim theo chiu rng trn th.
7.5.3. Tm cc thnh phn lin thng ca th.
7.5.4. Tm ng i gia hai nh bt k ca th.
7.5.5. Tm ng i v chu trnh Euler.
7.5.6. Tm ng i v chu trnh Hamilton.
43
7.5. CC THUT TON TM KIM TRN TH (2/62)
7.5.1. Thut ton tm kim theo chiu su trn th (1/6)
tng:
T tng c bn ca thut ton tm kim theo chiu su l bt u ti
mt nh v
0

no , chn mt nh u bt k k vi v
0

v ly n lm nh
duyt tip theo.
Cch duyt tip theo c thc hin tng t nh i vi nh v
0

vi
nh bt u l u .
44
7.5. CC THUT TON TM KIM TRN TH (3/62)
7.5.1. Thut ton tm kim theo chiu su trn th (2/6)
Ch : S dng mng chuaxet[] gm n phn t (tng ng vi n nh)
xc nh phn t c duyt.
Nu v
i
duyt, chuaxet[i] := FALSE. Ngc li, nu v
i
cha xt,
chuaxet[i] := TRUE.
Th tc qui DFS () c m t:
void DFS( int v){
Thm_nh(v); chuaxet[v]:= FALSE;
for ( u ke(v) ) {
if (chuaxet[u] ) DFS(u);
}
}
45
7.5. CC THUT TON TM KIM TRN TH (4/62)
7.5.1. Thut ton tm kim theo chiu su trn th (3/6)
Th tc DFS() s thm tt c cc nh cng thnh phn lin thng vi v
mi nh ng mt ln.
m bo duyt tt c cc nh ca th (c th c nhiu thnh phn
lin thng), chng ta ch cn thc hin duyt nh sau:
{
for (i=1; i n ; i++)
chuaxet[i]:= TRUE; /* thit lp gi
tr ban u cho mng chuaxet[]*/
for (i=1; i n ; i++)
if (chuaxet[i] )
DFS(i);
}
46
7.5. CC THUT TON TM KIM TRN TH (5/62)
7.5.1. Thut ton tm kim theo
chiu su trn th (4/6)
V d v tm kim theo chiu su:
Cho th sau:
47
Kt qu duyt:
1, 2, 4, 3, 6, 7,
8, 10, 5, 9, 13,
11, 12
7.5. CC THUT TON TM KIM TRN TH (6/62)
7.5.1. Thut ton tm kim theo chiu su trn th (5/6)
Chng trnh minh ha DFS
48
#include "iostream"
#include "conio.h"
#include "io.h"
#define MAX 100
#define TRUE 1
#define FALSE 0
using namespace std;
/* Depth First Search */
void Init(int G[][MAX], int *n){
FILE *fp;
fp=fopen("DFS.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file input";
return;
}
fscanf(fp,"%d", n);
cout<<"\n So dinh do thi:"<<*n;
cout<<"\n Ma tran ke cua do thi:";
for(int i=1; i<=*n;i++){
cout<<"\n";
for(int j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<< G[i][j];
}
}
}
7.5. CC THUT TON TM KIM TRN TH (7/62)
7.5.1. Thut ton tm kim theo chiu su trn th (6/6)
Chng trnh minh ha DFS (tip)
49
void DFS(int G[][MAX], int n,
int v, int chuaxet[]){
cout<<" "<<v;
chuaxet[v]=FALSE;
for(int u=1; u<=n; u++){
if(G[v][u]==1 && chuaxet[u])
DFS(G,n, u, chuaxet);
}
}
void main(void){
int G[MAX][MAX], n,
chuaxet[MAX];
Init(G, &n);
for(int i=1; i<=n; i++)
chuaxet[i]=TRUE;
cout<<"\n\n";
for(int i=1; i<=n;i++)
if(chuaxet[i])
DFS( G,n, i, chuaxet);
getch();
}
7.5. CC THUT TON TM KIM TRN TH (8/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (1/8)
Nhn xt DFS:
Vi thut ton tm kim theo chiu su, nh thm cng mun s tr
thnh nh sm c duyt xong. l kt qu tt yu v cc nh
thm c np vo stack trong th tc quy.
tng BFS:
i vi thut ton tm kim theo chiu rng s dng cu trc hng i
queue.
Nh vy, nh c np vo hng i u tin l v, cc nh k vi v
l: v
1
, v
2
,..., v
k
c np vo queue k tip. Qu trnh duyt tip theo
c bt u t cc nh cn c mt trong hng i.
50
7.5. CC THUT TON TM KIM TRN TH (9/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (2/8)
Thc hin gii thut:
ghi nhn trng thi duyt cc nh ca th, ta cng vn s
dng mng chuaxet[] gm n phn t thit lp gi tr ban u l
TRUE.
Nu nh i ca th c duyt, gi tr chuaxet[i] s nhn gi
tr FALSE.
Thut ton dng khi hng i rng.
51
7.5. CC THUT TON TM KIM TRN TH (10/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (3/8)
Gi m ca gii thut BFS:

52
void BFS(int u){
queue = ;
u queue;
/*np u vo hng i*/
chuaxet[u] = false;
/*i trng thi ca u*/
while (queue ) {
/*duyt ti khi no hng i rng*/
queue p;
/*ly p ra t khi hng i*/
Thm_nh(p);
/*duyt xong nh p*/
for (v ke(p) ) {
/*a cc nh v k vi p nhng cha
c xt vo hng i*/
if (chuaxet[v] ) {
v queue;
/*a v vo hng i*/
chuaxet[v] = false;
/* i trng thi ca v*/
}
}
} /*end while*/
}/*end BFS*/
7.5. CC THUT TON TM KIM TRN TH (11/62)
7.5.2. Thut ton tm kim
theo chiu rng trn th
(4/8)
Gi m ca gii thut BFS:
Th tc BFS s thm tt c
cc nh dng thnh phn lin
thng vi u.
thm tt c cc nh ca
th, cn thc hin on
theo on gi m sau:
53
{
for (u=1; un; u++)
chuaxet[u] = TRUE;
for (uV )
if (chuaxet[u] )
BFS(u);
}
7.5. CC THUT TON TM KIM TRN TH (12/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (5/8)
V d v BFS:
Cho th v hng G = <V,E> sau, duyt th theo phng php
BFS.
54
7.5. CC THUT TON TM KIM TRN TH (13/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (6/8)
Cc bc thc hin:
55
7.5. CC THUT TON TM KIM TRN TH (14/62)
7.5.2. Thut ton tm kim theo chiu rng trn th (7/8)
Chng trnh minh ha BFS
56
#include "iostream"
#include "conio.h"
#include "io.h"
#define MAX 100
#define TRUE 1
#define FALSE 0
using namespace std;
/*Breadth First Search */
void Init(int G[][MAX], int *n, int
*chuaxet){
FILE *fp; int i, j;
fp=fopen("BFS.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file input";
return;
}
fscanf(fp,"%d", n);
cout<<"\n So dinh do thi:"<<*n;
cout<<"\n Ma tran ke cua do thi:";
for(i=1; i<=*n;i++){
cout<<endl;
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<<G[i][j];
}
}
7.5. CC THUT TON TM KIM TRN TH (15/62)
7.5.2. Thut ton tm kim theo chiu
rng trn th (8/8)
Chng trnh minh ha BFS (tip)
57
for(i=1; i<=*n;i++)
chuaxet[i]=0;
}
void BFS(int G[][MAX], int n, int
i, int chuaxet[], int QUEUE[MAX])
{
int u, dauQ, cuoiQ, j;
dauQ=1;
cuoiQ=1;
QUEUE[cuoiQ]=i;
chuaxet[i]=FALSE;
/* thit lp hng i vi nh
u l i*/

while(dauQ<=cuoiQ){
u=QUEUE[dauQ];
cout<<" "<<u;
dauQ=dauQ+1; /* duyt nh u hng
i*/
for(j=1; j<=n;j++){
if(G[u][j]==1 && chuaxet[j] )
{
cuoiQ=cuoiQ+1;QUEUE[cuoiQ]=j;
chuaxet[j]=FALSE;
}
}
}
}
void main(void){
int G[MAX][MAX], n, chuaxet[MAX],
QUEUE[MAX], i;
Init(G, &n, chuaxet); cout<<"\n\n";
for(i=1; i<=n; i++)
chuaxet[i]= TRUE;
for(i=1; i<=n; i++)
if (chuaxet[i])
BFS(G, n, i, chuaxet, QUEUE);
getch();
}
7.5. CC THUT TON TM KIM TRN TH (16/62)
7.5.3. Duyt cc thnh phn lin thng ca th (1/10)
Mt th c th lin thng hoc khng lin thng.
Nu th lin thng th s thnh phn lin thng ca n l 1. iu ny
tng ng vi php duyt theo th tc DFS() hoc BFS() c gi
n ng mt ln.
Nu th khng lin thng (s thnh phn lin thng ln hn 1) chng
ta c th tch chng thnh nhng th con lin thng. iu ny cng
c ngha l trong php duyt th, s thnh phn lin thng ca n
bng s ln gi ti th tc DFS() hoc BFS().
58
7.5. CC THUT TON TM KIM TRN TH (17/62)
7.5.3. Duyt cc thnh phn lin thng ca th (2/10)
xc nh s cc thnh phn lin thng ca th, chng ta s dng
bin mi solt nghi nhn cc nh cng mt thnh phn lin thng
trong mng chuaxet[] nh sau:
Nu nh i cha c duyt, chuaxet[i] c gi tr 0;
Nu nh i c duyt thuc thnh phn lin thng th j = solt, ta ghi nhn
chuaxet[i] = solt;
Cc nh cng thnh phn lin thng nu chng c cng gi tr trong mng
chuaxet[].
59
7.5. CC THUT TON TM KIM TRN TH (18/62)
7.5.3. Duyt cc thnh phn lin thng ca th (3/10)
Vi cch lm nh trn, th tc BFS() hoc DFS() c th c sa li nh sau:
60
void BFS(int u){
queue = ;
u queue;
/*np u vo hng i*/
solt = solt+1;
chuaxet[u] = solt;
/*solt l bin ton cc thit lp gi
tr 0*/
while (queue ) {
queue p;
/* ly p ra t stack*/
for v ke(p) {
if (chuaxet[v] ) {
v queue;
/*np v vo hng i*/
chuaxet[v] = solt;
/*v c cng thnh phn lin thng vi
p*/
}
}
}
}
7.5. CC THUT TON TM KIM TRN TH (19/62)
7.5.3. Duyt cc thnh phn lin thng ca th (4/10)
duyt ht tt c cc thnh phn lin thng ca th, ta ch cn gi
ti th tc lienthong nh di y:
void Lien_Thong(void){
for (i=1; i n; i++)
chuaxet[i] =0;
for(i=1; i<=n; i++)
if(chuaxet[i]==0){
solt=solt+1;
BFS(i);
}
}
61
7.5. CC THUT TON TM KIM TRN TH (20/62)
7.5.3. Duyt cc thnh phn lin thng ca th (5/10)
ghi nhn tng nh ca th thuc thnh phn lin thng no, ta ch
cn duyt cc nh c cng chung gi tr trong mng chuaxet[] nh di
y:
void Result( int solt){
if (solt==1){
< Do thi la lien thong>;
}
for( i=1; i<=solt;i++){
/* a ra thnh phn lin thng th i*/
for( j=1; j<=n;j++){
if( chuaxet[j]==i)
<a ra nh j>;
}
}
}
62
7.5. CC THUT TON TM KIM TRN TH (21/62)
7.5.3. Duyt cc thnh phn lin thng ca th (6/10)
V d: cho th G = <V, E>, duyt cc thnh phn lin thng ca G:
63
7.5. CC THUT TON TM KIM TRN TH (22/62)
7.5.3. Duyt cc thnh phn lin thng ca th (7/10)
Cc bc thc hin:




Nhn xt:
nh 1, 2, 4, 5 cng c gi tr 1 trong mng chuaxet[] thuc thnh phn lin
thng th 1;
nh 3, 6,7 cng c gi tr 2 trong mng chuaxet[] thuc thnh phn lin
thng th 2;
nh 8, 9 cng c gi tr 3 trong mng chuaxet[] thuc thnh phn lin
thng th 3
64
7.5. CC THUT TON TM KIM TRN TH (23/62)
7.5.3. Duyt cc thnh phn lin thng ca th (8/10)
Chng trnh minh ha
65
#include "iostream"
#include "conio.h"
#include "io.h"
#define MAX 100
#define TRUE 1
#define FALSE 0
using namespace std;
/*Breadth First Search */
void Init(int G[][MAX], int *n, int
*solt, int *chuaxet){
FILE *fp; int i, j;
fp=fopen("lienthong.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file input";
return;
}
fscanf(fp,"%d", n);
cout<<"\n So dinh do thi:"<<*n;
cout<<"\n Ma tran ke cua do thi:";
for(i=1; i<=*n;i++){
cout<<endl;
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<<G[i][j];
}
}
7.5. CC THUT TON TM KIM TRN TH (24/62)
7.5.3. Duyt cc thnh phn lin thng
ca th (9/10)
Chng trnh minh ha (tip)
66
for(i=1; i<=*n;i++)
chuaxet[i]=0;
*solt=0;
fclose(fp);
}
void Result(int *chuaxet, int n,
int solt){
cout<<"\n\n";
if(solt==1){
cout<<"\n Do thi la lien
thong";
getch();
return;
}
for(int i=1; i<=solt;i++){
cout<<"\n Thanh phan lien
thong thu: "<<i;
for(int j=1; j<=n;j++){
if( chuaxet[j]==i)
cout<<" "<<j;
}
}
}
void BFS(int G[][MAX], int n, int
i, int *solt, int chuaxet[], int
QUEUE[MAX]){
int u, dauQ, cuoiQ, j;
dauQ=1;
cuoiQ=1;
QUEUE[cuoiQ]=i;
chuaxet[i]=*solt;

7.5. CC THUT TON TM KIM TRN TH (25/62)
7.5.3. Duyt cc thnh phn lin thng
ca th (10/10)
Chng trnh minh ha (tip)
67
while(dauQ<=cuoiQ){
u=QUEUE[dauQ];
cout<<" "<<u;
dauQ=dauQ+1;
for(j=1; j<=n;j++){
if(G[u][j]==1 &&
chuaxet[j]==0){
cuoiQ=cuoiQ+1;
QUEUE[cuoiQ]=j;
chuaxet[j]=*solt;
}
}
}
}
void Lien_Thong(void){
int G[MAX][MAX], n,
chuaxet[MAX], QUEUE[MAX], solt,i;
Init(G, &n,&solt, chuaxet);
cout<<"\n\n";
for(i=1; i<=n; i++)
if(chuaxet[i]==0){
solt=solt+1;
BFS(G, n, i, &solt,
chuaxet, QUEUE);
}
Result(chuaxet, n, solt);
getch();
}

void main(void){
Lien_Thong();
}
7.5. CC THUT TON TM KIM TRN TH (26/62)
7.5.4. Tm ng i gia 2 nh trn th (1/8)
Bi ton: Cho th G=(V, E). Trong V l tp nh, E l tp cnh ca
th. Hy tm ng i t nh sV ti nh tV.
Phn tch bi ton:
Th tc BFS(s) hoc DFS(s) cho php duyt cc nh cng mt thnh
phn lin thng vi s.
Nu trong s cc nh lin thng vi s cha t th chc chn c ng
i t s n t. Ngc li, khng tn ti ng i gia s v t.
iu ny c thc hin thng qua mng trng thi chuaxet[].
Nu chuaxet[t] = False th c ngha t cng thnh phn lin thng vi s.
Ngc li chuaxet[t] = True th t khng cng thnh phn lin thng vi s.
68
7.5. CC THUT TON TM KIM TRN TH (27/62)
7.5.4. Tm ng i gia 2 nh trn th (2/8)
ghi nhn ng i t s n t, s dng mt mng truoc[] thit lp gi tr
ban u l 0.
Trong qu trnh duyt, thay th gi tr ca truoc[v] ghi nhn nh i
trc nh v trong ng i tm kim t s n v.
Khi , trong th tc DFS(v) ta ch cn thay i li nh sau:
void DFS( int v){
chuaxet[v]:= FALSE;
for ( u ke(v) ) {
if (chuaxet[u] ) {
truoc[u]=v;
DFS(u);
}
}
}
69
7.5. CC THUT TON TM KIM TRN TH (28/62)
7.5.4. Tm ng i gia 2 nh trn th (3/8)
i vi th tc BFS(v) c thay i li nh sau :
70
void BFS(int u){
queue = ;
u queue;
/*np u vo hng i*/
chuaxet[u] = false;
/* i trng thi ca u*/
while (queue ) {
/* duyt ti khi no hng i
rng*/
queue p;
/*ly p ra t khi hng i*/
for (v ke(p) ) {
/* a cc nh v k vi p nhng
cha c xt vo hng i*/
if (chuaxet[v] ) {
v queue;
/*a v vo hng i*/
chuaxet[v] = false;
/* i trng thi ca v*/
truoc[v]=p;
}
}
} /* end while*/
}/* end BFS*/
7.5. CC THUT TON TM KIM TRN TH (29/62)
7.5.4. Tm ng i gia 2 nh trn th (4/8)
Kt qu ng i c c ngc li thng qua th tc Result() nh sau:
void Result(void){
if(truoc[t]==0){
<Khng c ng i ts n t>;
return;
}
j = t;
while(truoc[j]!=s){
<thm nh j>;
j=truoc[j];
}
<thm nh s>;
}
71
7.5. CC THUT TON TM KIM TRN TH (30/62)
7.5.4. Tm ng i gia 2 nh trn th (5/8)
Tm ng i t nh 1 n nh 7 bng thut ton tm kim theo chiu rng vi
th G = <V, E> sau:








Ta c, BFS(1) = 1,2,3,11,4,6,12,13,7,8,9,10,5. R rng chuaxet[7] = True nn c ng
i t nh 1 n nh 7. By gi xc nh gi tr trong mng truoc[] c kt qu ng i
c theo chiu ngc li.
Truoc[7] = 6; truoc[6] = 2; truoc[2] =1 => ng i t nh 1 n nh 7 l 1 =>2=>6=>7.
72
7.5. CC THUT TON TM KIM TRN TH (31/62)
7.5.4. Tm ng i gia 2 nh trn
th (6/8)
Chng trnh minh ha
73
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 100
#define TRUE 1
#define FALSE 0
int n, truoc[MAX], chuaxet[MAX],
queue[MAX];
int G[MAX][MAX];
int s, t;
/* Breadth First Search */
void Init(void){
FILE *fp; int i, j;
fp=fopen("DOTHI.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file
input";
return;
}
fscanf(fp,"%d", &n);
cout<<"\n So dinh do thi:
"<<n;
cout<<"\n Ma tran ke cua do
thi:";
for(i=1; i<=n;i++){
cout<<endl;
for(j=1; j<=n;j++){
fscanf(fp,"%d",
&G[i][j]);
cout<<" "<<G[i][j];
}
}
7.5. CC THUT TON TM KIM TRN TH (32/62)
7.5.4. Tm ng i gia 2 nh trn
th (7/8)
Chng trnh minh ha
74
for(i=1; i<=n;i++){
chuaxet[i]=TRUE;
truoc[i]=0;
}
}
void Result(void){
cout<<"\n\n";
if(truoc[t]==0){
cout<<"\n Khong co duong di
tu "<<s<<" den "<<t;
getch();
return;
}
cout<<"\n Duong di tu "<<s<<"
den "<<t<<" la:";
int j = t;
cout<<t<<"<=";
while(truoc[j]!=s){
cout<<truoc[j]<<" <=";
j=truoc[j];
}
cout<<" "<<s;
}
void In(void){
cout<<"\n\n";
for(int i=1; i<=n; i++)
cout<<" "<<truoc[i];
}
void BFS(int s) {
int dauQ, cuoiQ, p, u;
cout<<endl;
dauQ=1;cuoiQ=1;
queue[dauQ]=s;
chuaxet[s]=FALSE;
7.5. CC THUT TON TM KIM TRN TH (33/62)
7.5.4. Tm ng i gia 2 nh trn
th (8/8)
Chng trnh minh ha
75
while (dauQ<=cuoiQ){
u=queue[dauQ]; dauQ=dauQ+1;
cout<<" "<<u;
for (p=1; p<=n;p++){
if(G[u][p] &&
chuaxet[p]){
cuoiQ=cuoiQ+1;
queue[cuoiQ]=p;
chuaxet[p]=FALSE;
truoc[p]=u;
}
}
}
}
void duongdi(void){
int chuaxet[MAX], truoc[MAX],
queue[MAX];
Init();
BFS(s);
Result();
}
void main(void){
cout<<"\n Dinh dau:"; cin>>s;
cout<<"\n Dinh cuoi:"; cin>>t;
Init();
cout<<endl;
BFS(s);
In();
getch();
Result();
getch();
}
7.5. CC THUT TON TM KIM TRN TH (34/62)
7.5.5. ng i v chu trnh EULER (1/17)
nh ngha 7.5.5:
Chu trnh n trong th G i qua mi cnh ca th ng mt ln c
gi l chu trnh Euler.
ng i n trong G i qua mi cnh ca n ng mt ln c gi l
ng i Euler.
th c gi l th Euler nu n c chu trnh Euler.
th c ng i Euler c gi l na Euler.

Nhn xt:
Mi th Euler u l na Euler nhng iu ngc li khng ng.
76
7.5. CC THUT TON TM KIM TRN TH (35/62)
7.5.5. ng i v chu trnh EULER (2/17)
V d 7.5.5.1:






th G1 l th Euler: n c chu trnh Euler a, e, c, d, e, b, a.
th G3 khng c chu trnh Euler nhng cha ng i Euler a, c, d, e, b, d,
a, b v th G3 l na Euler.
G2 khng c chu trnh Euler cng nh ng i Euler

77
7.5. CC THUT TON TM KIM TRN TH (36/62)
7.5.5. ng i v chu trnh EULER (3/17)
V d 7.5.5.2:






th H2 l th Euler v n cha chu trnh Euler a, b, c, d, e, a v vy n l
th Euler.
th H3 khng c chu trnh Euler nhng c ng i Euler a, b, c, a, d, c nn
n l th na Euler.
th H1 khng cha chu trnh Euler cng nh ng i Euler.
78
7.5. CC THUT TON TM KIM TRN TH (37/62)
7.5.5. ng i v chu trnh EULER (4/17)
nh l 7.5.5.1.
th v hng lin thng G=(V, E) l th Euler khi v ch khi mi nh
ca G u c bc chn.
th v hng lin thng G=(V, E) l th na Euler khi v ch khi n
khng c qu hai nh bc l.
79
7.5. CC THUT TON TM KIM TRN TH (38/62)
7.5.5. ng i v chu trnh EULER (5/17)
tm mt chu trnh Euler, ta thc hin theo thut ton sau:
To mt mng CE ghi ng i v mt stack xp cc nh ta s xt.
Xp vo mt nh tu u no ca th, ngha l nh u s c xt
u tin.
Xt nh trn cng ca ngn xp, gi s nh l nh v, v thc hin:
Nu v l nh c lp th ly v khi ngn xp v a vo CE;
Nu v l lin thng vi nh x th xp x vo ngn xp sau xo b cnh
(v, x);
Quay li bc 2 cho ti khi ngn xp rng.
Kt qu chu trnh Euler c cha trong CE theo th t ngc li.
80
7.5. CC THUT TON TM KIM TRN TH (39/62)
7.5.5. ng i v chu trnh EULER (6/17)
Gi m tm chu trnh Euler:
81
void Euler_Cycle(void){
Stack:=; CE:= ;
Chn u l nh no ca
th;
u Stack;
/*np u vo stack*/
while (Stack ) {
/*duyt cho n khi stack rng*/
x= top(Stack);
/*x l phn t u stack*/
if (ke(x) ) ) {
y = nh u trong danh
sch ke(x);
Stack y;
/*np y vo Stack*/
Ke(x) = Ke(x) \ {y};
Ke(y) = Ke(y)\{x};
/*loi cnh (x,y) khi th*/
}
else {
x Stack;
/*ly x ra khi stack*/;
CE x;
/*np x vo CE*/
}
}
}
7.5. CC THUT TON TM KIM TRN TH (40/62)
7.5.5. ng i v chu trnh EULER (7/17)
V d:






Cho th G = <V, E> trn, tm chu trnh Euler
82
7.5. CC THUT TON TM KIM TRN TH (41/62)
7.5.5.
ng
i v
chu
trnh
EULER
(8/17)

Kt qu
thc
hin
83
7.5. CC THUT TON TM KIM TRN TH (42/62)
7.5.5. ng i v chu trnh EULER (9/17)
Gi m tm chu trnh Euler:
84
void Euler_Cycle(void){
Stack:=; CE:= ;
Chn u l nh no ca
th;
u Stack;
/*np u vo stack*/
while (Stack ) {
/*duyt cho n khi stack rng*/
x= top(Stack);
/*x l phn t u stack*/
if (ke(x) ) ) {
y = nh u trong danh
sch ke(x);
Stack y;
/*np y vo Stack*/
Ke(x) = Ke(x) \ {y};
Ke(y) = Ke(y)\{x};
/*loi cnh (x,y) khi th*/
}
else {
x Stack;
/*ly x ra khi stack*/;
CE x;
/*np x vo CE*/
}
}
}
7.5. CC THUT TON TM KIM TRN TH (43/62)
7.5.5. ng i v chu trnh EULER (10/17)
Chng trnh tm chu trnh Euler:
85
#include "conio.h"
#include "iostream"
#include "io.h"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int G[MAX][MAX], n, u=1;
void Init(void){
int i, j;
FILE *fp;
fp = fopen("CTEULER.IN", "r");
fscanf(fp,"%d", &n);
cout<<"\n So dinh do
thi:%d"<<n;
cout<<"\n Ma tran ke:";
for(i=1; i<=n;i++){
cout<<"\n";
for(j=1; j<=n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<<G[i][j];
}
} fclose(fp);
}
int Kiemtra(void){
int i, j, s, d=0;
for(i=1; i<=n;i++){
s=0;
for(j=1; j<=n;j++)
s+=G[i][j];
if(s%2) d++;
}
if(d>0) return(FALSE);
return(TRUE);
}
7.5. CC THUT TON TM KIM TRN TH (44/62)
7.5.5. ng i v chu trnh EULER (11/17)
Chng trnh tm chu trnh Euler (tip):
86
void Tim(void){
int v, x, top, dCE;
int stack[MAX], CE[MAX];
top=1; stack[top]=u;dCE=0;
do {
v = stack[top];x=1;
while (x<=n && G[v][x]==0)
x++;
if (x>n) {
dCE++; CE[dCE]=v; top--;
}
else {
top++; stack[top]=x;
G[v][x]=0; G[x][v]=0;
}
} while(top!=0);
cout<<"\n Co chu trinh Euler:";
for(x=dCE; x>0; x--)
cout<<" "<<CE[x]; }
void main(void){
Init();
if(Kiemtra())
Tim();
else cout<<"\n Khong co chu
trinh Euler";
getch();
}
7.5. CC THUT TON TM KIM TRN TH (45/62)
7.5.5. ng i v chu trnh EULER (12/17)
Mt th khng c chu trnh Euler nhng vn c th c
ng i Euler.
Trong trng hp ny, th c ng hai nh bc l.
Mt ng i Euler: xut pht t nh bc l, kt thc nh bc
l cn li.
Nh vy, thut ton tm ng i Euler thay i:
Phi xc nh im xut pht ca ng i t nh bc l ny
v kt thc nh bc l khc.
87
7.5. CC THUT TON TM KIM TRN TH (46/62)
7.5.5. ng i v chu trnh EULER (13/17)
Chng trnh tm ng i Euler:
88
#include "conio.h"
#include "iostream"
#include "io.h"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
void Init(int G[][MAX], int *n){
int i, j;FILE *fp;
fp = fopen("DDEULER.IN", "r");
fscanf(fp,"%d", n);
cout<<"\n So dinh do
thi:"<<*n;
cout<<"\n Ma tran ke:";
for(i=1; i<=*n;i++){
cout<<"\n";
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<< G[i][j];
}
}
fclose(fp);
}
int Kiemtra(int G[][MAX], int n,
int *u){
int i, j, s, d=0;
for(i=1; i<=n;i++){
s=0;
for(j=1; j<=n;j++)
s= s + G[i][j];
if(s%2==1){
d++;*u=i;
}
}
if(d!=2) return(FALSE);
return(TRUE);
}
7.5. CC THUT TON TM KIM TRN TH (47/62)
7.5.5. ng i v chu trnh EULER (14/17)
Chng trnh tm ng i Euler (tip):
89
void DDEULER(int G[][MAX], int n,
int u){
int v, x, top, dCE;
int stack[MAX], CE[MAX];
top=1; stack[top]=u;dCE=0;
do {
v = stack[top];x=1;
while (x<=n && G[v][x]==0)
x++;
if (x>n) {
dCE++; CE[dCE]=v; top--;
}
else {
top++; stack[top]=x;
G[v][x]=0; G[x][v]=0;
}
} while(top!=0);
cout<<"\n Co duong di Euler:";
for(x=dCE; x>0; x--)
cout<<" "<< CE[x];
}
void main(void){
int G[MAX][MAX], n, u;
Init(G, &n);
if(Kiemtra(G,n,&u))
DDEULER(G,n,u);
else cout<<"\n Khong co duong
di Euler";
getch();
}
7.5. CC THUT TON TM KIM TRN TH (48/62)
7.5.5. ng i v chu trnh EULER (15/17)
tm tt c cc ng i Euler ca mt th n nh, m cnh, ta c
th dng k thut quy nh sau:
Bc 1:
Mng b c di m + 1 l ngn xp cha ng i.
t b[0]=1, i=1 (xt nh th nht ca ng i);
Bc 2:
Cho b[i] cc gi tr l nh k vi b[i-1] m cnh (b[i-1],b[i])
khng trng vi nhng cnh dng t b[0] n b[i-1].
Vi mi gi tr ca b[i], ta kim tra:
Nu i<m th xt nh tip theo v quay li bc 2.
Nu i==m th dy b chnh l mt ng i Euler
90
7.5. CC THUT TON TM KIM TRN TH (49/62)
7.5.5. ng i v chu trnh EULER (16/17)
Chng trnh tm cc ng i Euler:
91
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int m, b[MAX], u, i, OK;
void Init(int G[][MAX], int *n){
int i, j, s, d;
FILE *fp;
fp = fopen("DDEULER.IN", "r");
fscanf(fp,"%d", n);
cout<<"\n So dinh cua G:"<<*n;
cout<<"\n Ma tran ke:";
u=1; d=0; m=0;
for(i=1; i<=*n;i++){
cout<<"\n";s=0;
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
cout<<" "<<G[i][j];
s+=G[i][j];
}
if (s%2) { d++;u=i; }
m=m+s;
}
m=m /2;
if (d!=2) OK=FALSE;
else OK=TRUE;
fclose(fp);
}
void Result(void){
int i;
cout<<"\n Co duong di Euler:";
for(i=0; i<=m; i++)
cout<<" "<<b[i];
}
7.5. CC THUT TON TM KIM TRN TH (50/62)
7.5.5. ng i v chu trnh EULER (17/17)
Chng trnh tm cc ng i Euler (tip):
92
void DDEULER(int *b, int
G[][MAX], int n, int i){
int j, k;
for(j=1; j<=n;j++){
if (G[b[i-1]][j]==1){
G[b[i-1]][j]=0;
G[j][b[i-1]]=0;
b[i]=j;
if(i==m) Result();
else DDEULER(b, G, n, i+1);
G[b[i-1]][j]=1;
G[j][b[i-1]]=1;
}
}
}
void main(void){
int G[MAX][MAX], n;
Init(G, &n);
b[0]=u;i=1;
if(OK) DDEULER(b, G, n, i);
else cout<<"\n Khong co duong
di Euler";
getch();
}
7.5. CC THUT TON TM KIM TRN TH (50/62)
7.5.5. ng i v chu trnh EULER (17/17)
93
7.5. CC THUT TON TM KIM TRN TH (51/62)
7.5.6. ng i v chu trnh HAMILTON (1/12)
nh ngha:
ng i qua tt c cc nh ca th, mi nh ng mt ln
c gi l ng i Hamilton.
Chu trnh bt u ti mt nh v no qua tt c cc nh cn li
mi nh ng mt ln sau quay tr li v c gi l chu trnh
Hamilton.
th c gi l th Hamilton nu n cha chu trnh Hamilton.
th c gi l na Hamilton nu n cha ng i Hamilton.
Nh vy, mt th Hamilton bao gi cng l th na Hamilton
nhng iu ngc li khng lun lun ng.
94
7.5. CC THUT TON TM KIM TRN TH (52/62)
7.5.6. ng i v chu trnh HAMILTON (2/12)






th th Hamilton G1, G3,
Na Hamilton G2
95
7.5. CC THUT TON TM KIM TRN TH (53/62)
7.5.6. ng i v chu trnh HAMILTON (3/12)
Cha c thut ton hiu qu kim tra mt th c phi l Hamilton hay
khng. Thut ton sau lit k cc chu trnh Hamilton ca th:
96
void Hamilton( int k) {
/* Lit k cc chu trnh Hamilton ca th bng cch
pht trin dy nh (X[1], X[2],..., X[k-1]) ca th
G=(V,E) */
for y Ke(X[k-1]) {
if ((k==n+1) && (y == v0))
Ghinhan(X[1], X[2],..., X[n], v0);
else {
X[k]=y; chuaxet[y] = false;
Hamilton(k+1);
chuaxet[y] = true;
}
}
}
7.5. CC THUT TON TM KIM TRN TH (54/62)
7.5.6. ng i v chu trnh HAMILTON (4/12)
Gi m chng trnh chnh c th hin nh sau :
97
{
for (v V ) chuaxet[v] = true;
/*thit lp trng thi cc nh*/
X[1] = v0;
/* v0 l mt nh no ca th */
chuaxet[v0] = false;
Hamilton(2);
}
7.5. CC THUT TON TM KIM TRN TH (55/62)
7.5.6. ng i v chu trnh HAMILTON (5/12)
V d v tm kim chu trnh Hamilton:
98
Cy tm kim chu trnh Hamilton
7.5. CC THUT TON TM KIM TRN TH (56/62)
7.5.6. ng i v chu trnh HAMILTON (6/12)
nh l 7.5.6:
Gi s G l mt n th lin thng c n nh, n > 3. Khi G c
chu trnh Hamilton nu bc ca mi nh t nht bng n/2.
99
7.5. CC THUT TON TM KIM TRN TH (57/62)
7.5.6. ng i v chu trnh HAMILTON (7/12)
Chng minh nh l 7.5.6:
Thm vo G cc nh mi v ni chng vi tt c cc nh ca G.
Gi k l s t nht cc nh cn thm vo cho th thu c G
l th Hamilton. Ta s chng minh k=0.
Thc vy, gi s k>0.
K hiu v, p, w, , v l mt chu trnh Hamilton trong G trong v, w
l cc nh ca G, cn p l mt trong s cc nh mi thm vo.
R rng v v w khng k nhau, v nu chng k nhau ta c th ni
trc tip v vi w v bt c nh p, iu ny mu thun vi k l s
nh nht.
100
7.5. CC THUT TON TM KIM TRN TH (58/62)
7.5.6. ng i v chu trnh HAMILTON (8/12)
Chng minh nh l 7.5.6 (tip):
Mt khc trong G, mi nh k vi w (w chng hn) khng th i
lin sau nh k vi v (v chng hn) v khi c th thay chu trnh v
p w v w v bi chu trnh v v w
w v bng cch o ngc on ca chu trnh nm gia w
v v khng cn s dng ti p.
T y suy ra sau mi nh k vi v phi l mt nh khng k vi
w, tc l s nh trong G khng k vi w t ra phi l (n/2+k), mt
khc s nh k vi w t ra cng phi l (n/2+k). Do khng c nh
no va khng k li va k vi w nn s nh ca G phi khng t
hn n+2k. iu ny mu thun vi vic G c ng n+k nh. .
101
7.5. CC THUT TON TM KIM TRN TH (59/62)
7.5.6. ng i v chu trnh HAMILTON (9/12)
Chng trnh tm chu trnh Hamilton:
102
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int A[MAX][MAX], C[MAX], B[MAX];
int n,i, d;
void Init(void){
int i, j;
FILE *fp;
fp= fopen("CCHMTON.IN", "r");
if(fp==NULL){
cout<<"\n Khong co du lieu";
getch();
return;
}
fscanf(fp,"%d",&n);
cout<<"\n So dinh do thi:"<<n;
cout<<"\n Ma tran ke:";
for(i=1; i<=n; i++){
cout<<"\n";
for(j=1; j<=n; j++){
fscanf(fp, "%d", &A[i][j]);
cout<<" "<<A[i][j];
}
}
fclose(fp);
for (i=1; i<=n;i++)
C[i]=0;
}
void Result(void){
int i;
cout<<"\n\n";
for(i=n; i>=0; i--)
cout<<" "<<B[i];
d++; }
7.5. CC THUT TON TM KIM TRN TH (60/62)
7.5.6. ng i v chu trnh HAMILTON (10/12)
Chng trnh tm chu trnh Hamilton:
103
void Hamilton(int *B, int *C, int
i){
int j, k;
for(j=1; j<=n; j++){
if(A[B[i-1]][j]==1 &&
C[j]==0){
B[i]=j;
C[j]=1;
if(i<n) Hamilton(B, C,
i+1);
else
if(B[i]==B[0]) Result();
C[j]=0;
}
}
}
void main(void){
B[0]=1;
i=1;
d=0;
Init();
Hamilton(B,C,i);
if(d==0)
cout<<"\n Khong co chu trinh
Hamilton";
getch();
}
7.5. CC THUT TON TM KIM TRN TH (61/62)
7.5.6. ng i v chu trnh HAMILTON (11/12)
Chng trnh tm ng i Hamilton:
104
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int A[MAX][MAX], C[MAX], B[MAX];
int n,i, d;
void Init(void){
int i, j;
FILE *fp;
fp= fopen("DDHMTON.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file
input";
getch();
return;
}
fscanf(fp,"%d",&n);
cout<<"\n So dinh do thi:"<<n;
cout<<"\n Ma tran ke:";
for(i=1; i<=n; i++){
cout<<"\n";
for(j=1; j<=n; j++){
fscanf(fp, "%d", &A[i][j]);
cout<<" "<<A[i][j];
}
}
fclose(fp);
for (i=1; i<=n;i++)
C[i]=0;
}
void Result(void){
int i;
cout<<"\n";
for(i=n; i>0; i--)
cout<<" "<<B[i]; d++; }
7.5. CC THUT TON TM KIM TRN TH (62/62)
7.5.6. ng i v chu trnh HAMILTON (12/12)
Chng trnh tm ng i Hamilton :
105
void Hamilton(int *B, int *C, int
i){
int j, k;
for(j=1; j<=n; j++){
if(A[B[i-1]][j]==1 &&
C[j]==0){
B[i]=j; C[j]=1;
if(i<n)
Hamilton(B, C, i+1);
else Result();
C[j]=0;
}
}
}
void main(void){
B[0]=1;
i=1;
d=0;
Init();
Hamilton(B,C,i);
if(d==0)
cout<<"\n Khong co duong di
Hamilton";
getch();
}
7.5. CC THUT TON TM KIM TRN TH (62/62)
7.5.6. ng i v chu trnh HAMILTON (12/12)
106
7.6. TM NG I NGN NHT (1/12)
Trong phn ny, gii thiu v gii thut tm ng i ngn
nht gia 2 nh trn th c trng s.
Ni dung gm:
7.6.1. Gii thiu v bi ton
7.6.1. Thut ton gn nhn.
7.6.2. Thut ton Dijkstra
107
7.6. TM NG I NGN NHT (2/12)
108
7.6.1. Gii thiu bi ton
7.6. TM NG I NGN NHT (3/12)
7.6.2. Thut ton gn nhn (1/4)
Thut ton c m t nh sau:
T ma trn trng s A[u,v], u,vV, tm cn trn d[v] ca
khong cch t s n tt c cc nh vV.
Nu thy d[u] + A[u,v] < d[v] th d[v] = d[u] + A[u, v] (lm
tt ln gi tr ca d[v])
Qu trnh s kt thc khi khng th lm tt ln c na.
Khi d[v] s cho ta gi tr ngn nht t nh s n nh v.
Gi tr d[v] c gi l nhn ca nh v.
109
7.6. TM NG I NGN NHT (4/12)
7.6.2. Thut ton gn nhn (2/4)
V d v thut ton:
Tm ng i ngn nht t A n Z trong th G sau.

110
7.6. TM NG I NGN NHT (5/12)
111
7.6.2. Thut ton gn nhn (3/4)

7.6. TM NG I NGN NHT (6/12)
112
7.6.2. Thut ton gn nhn (4/4)

7.6. TM NG I NGN NHT (7/12)
7.6.3. Thut ton Dijkstra (1/6)
Thut ton ny do E.Dijkstra, nh ton hc ngi H Lan, xut nm
1959.
Thut ton tm ng i ngn nht t nh s n cc nh cn li c
Dijkstra ngh p dng cho trng hp th c hng vi trng s
khng m.
Thut ton c thc hin trn c s gn tm thi cho cc nh.
Nhn ca mi nh cho bit cn trn ca di ng i ngn nht ti
nh .
Cc nhn ny s c bin i (tnh li) nh mt th tc lp, m mi
bc lp mt s nh s c nhn khng thay i, nhn chnh l
di ng i ngn nht t s n nh .
113
7.6. TM NG I NGN NHT (8/12)
7.6.3. Thut ton Dijkstra (2/6)
Gi m ca gii thut Dijkstra:
114
void Dijkstra(void)
/*u vo G=(V, E) vi n nh c
ma trn trng s A[u,v] 0; sV
*/
/*u ra l khong cch nh nht
t s n cc nh cn li d[v]:
vV*/
/*Truoc[v]: ghi li nh trc v
trong ng i ngn nht t s n
v*/
{
/*Bc 1: Khi to nhn tm thi
cho cc nh*/
for ( v V ) {
d[v] = A[s,v];
truoc[v]=s;
}
d[s]=0;
T = V\{s};
/*T l tp nh c nhn tm
thi*/
/* Bc lp */
while (T != ) {
Tm nh u T sao cho
d[u] = min { d[z] | zT};
T= T\{u};
/*c nh nhn nh u*/
for ( v T ) {
/*Gn li nhn cho cc nh
trong T*/
if (d[v] > d[u] + A[u,v]) {
d[v] = d[u] + A[u,v];
truoc[v] =u;
}
}
}
}
7.6. TM NG I NGN NHT (9/12)
7.6.3. Thut ton Dijkstra (3/6)
V d v gii thut Dijkstra:
Cho th G nh trn, tm ng t 1->6
Cc bc thc hin
115
Bc lp nh 1 nh 2 nh 3 nh 4 nh 5 nh 6
Khi to 0,1 4,1 2,1 () ,1 ,1 ,1
1 - 3,3 () - 10,3 12,3 ,1
2 - - - 8,2 () 12,3 ,1
3 - - - - 10,4 () 14,4
4 - - - - - 13,5 ()
5 - - - - - -
()
7.6. TM NG I NGN NHT (10/12)
7.6.3. Thut ton Dijkstra (4/6)
Chng trnh minh ha gii thut Dijkstra:
116
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 100
#define TRUE 1
#define FALSE 0
int n, s, z;
char chon;
int truoc[MAX],d[MAX],G[MAX][MAX];
int final[MAX];
void Init(void){
FILE * fp;
int i, j;
fp = fopen("dothi.in","r");
fscanf(fp,"%d", &n);
cout<<"\n So dinh:"<<n;
cout<<"\n Ma tran trong so:";

for(i=1;i<=n;i++){
cout<<"\n";
for(j=1;j<=n;j++){
fscanf(fp,"%d",&G[i][j]);
cout<<" "<<G[i][j];
if(G[i][j]==0)
G[i][j]=32000;
}
}
fclose(fp);
}
void Result(void){
int i,j;
cout<<"\n Duong di ngan nhat tu
"<<s<<" den "<<z<<" la\n";
cout<<" <="<<z;
i=truoc[z];

7.6. TM NG I NGN NHT (11/12)
7.6.3. Thut ton Dijkstra (5/6)
Chng trnh minh ha gii thut Dijkstra:
117
while(i!=s){
cout<<" <="<<i;
i=truoc[i]; }
cout<<" <="<<s;
cout<<"\n Do dai duong di la:
"<<d[z]; }
void Dijkstra(void){
int v, u, minp;
cout<<"\n Tim duong di tu s= ";
cin>>s;
cout<<" den z=";
cin>>z;
for(v=1;v<=n; v++){
d[v]=G[s][v];
truoc[v]=s;
final[v]=FALSE;
}
truoc[s]=0;
d[s]=0;

final[s]=TRUE;
while(!final[z]) {
minp=32000;
for(v=1; v<=n; v++){
if((!final[v]) &&
(minp>d[v]) ){
u=v;
minp=d[v];}
}
final[u]=TRUE;
if(!final[z]){
for(v=1; v<=n; v++){
if ((!final[v]) &&
(d[u]+ G[u][v]< d[v])){
d[v]=d[u]+G[u][v];
truoc[v]=u;}
}
}
}
}
7.6. TM NG I NGN NHT (12/12)
7.6.3. Thut ton Dijkstra (6/6)
Chng trnh minh ha gii thut Dijkstra:
118
void main(void)
{
Init();
Dijkstra();
Result();
getch();
}
7.7. CY V NG DNG (2/43)
7.7.1. Cy v mt s tnh cht c bn (1/2)
nh ngha 7.7.1:
Cy l th v hng lin thng khng c chu trnh.
Rng l th khng lin thng, khng c chu trnh.
Nh vy, rng l th m mi thnh phn lin thng ca n l mt
cy.
119
V d: rng gm 3 cy T1, T2, T3
7.7. CY V NG DNG (3/43)
7.7.1. Cy v mt s tnh cht c bn (2/2)
nh l 7.7.1:
Gi s T= <V, E> l th v hng n nh. Khi nhng khng nh sau
l tng ng:
a) T l mt cy;
b) T khng c chu trnh v c n-1 cnh;
c) T lin thng v c ng n-1 cnh;
d) T lin thng v mi cnh ca n u l cu;
e) Gia hai nh bt k ca T c ni vi nhau bi ng mt ng i
n;
f) T khng cha chu trnh nhng nu thm vo n mt cnh ta thu c
ng mt chu trnh.
120
7.7. CY V NG DNG (4/43)
7.7.2. Mt s ng dng ca cy (1/5)
7.7.2.1. Cy nh phn tm kim (1/2)
nh ngha 7.6.2.
Cy nh phn tm kim T l cy nh phn c sp, trong mi nh
c gn bi mt gi tr kha sao cho gi tr kha ca cc nh thuc
nhnh cy con bn tri nh hn gi tr kha ti nh gc, gi tr kha
thuc nhnh cy con bn phi ln hn gi tr kha ti nh gc v mi
nhnh cy con bn tri, bn phi cng t hnh thnh nn mt cy nh
phn tm kim.
121
7.7. CY V NG DNG (5/43)
7.7.2. Mt s ng dng ca cy (2/5)
7.7.2.1. Cy nh phn tm kim (2/2)
122
V d v cy nh phn tm kim
7.7. CY V NG DNG (6/43)
7.7.2. Mt s ng dng ca cy (3/5)
7.7.2.2. Cy nh quyt nh (1/3)
nh ngha 7.6.3.
Cy quyt nh l cy c gc trong mi nh tng ng vi mt
quyt nh; mi cy con thuc nh ny tng ng vi mt kt lun
hoc quyt nh c th c. Nhng li gii c th c tng ng vi cc
ng i t gc ti l ca n. Li gii ng vi mt trong cc ng i
ny.
123
7.7. CY V NG DNG (7/43)
7.7.2. Mt s ng dng ca cy (4/5)
7.7.2.2. Cy nh quyt nh (2/3)
V d v cy quyt nh:
C 4 ng xu trong c 1 ng xu gi nh hn ng xu tht. Xc nh
s ln cn (thng bng) cn thit xc nh ng xu gi.
Cch gii:
R rng ta ch cn hai ln cn xc nh ng xu gi v khi ta t bn
ng xu ln bn cn th ch c th xy ra hai kt lun: ng s 1,2 nh
hn hoc nng hn ng s 3, 4. Thc hin quyt nh cn li ging
nh trn cho hai ng xu nh hn ta xc nh c ng xu no l gi.
124
7.7. CY V NG DNG (8/43)
7.7.2. Mt s ng dng ca cy (5/5)
7.7.2.2. Cy nh quyt nh (3/3)
V d v cy quyt nh (tip):
C 4 ng xu trong c 1 ng xu gi nh hn ng xu tht. Xc nh
s ln cn (thng bng) cn thit xc nh ng xu gi.

125
Cy quyt nh gii quyt bi ton
7.7. CY V NG DNG (9/43)
7.7.3. Cc phng php duyt cy (1/11)
Vic thm tt c cc node trn cy 1 ln c gi l duyt cy.
Vi mt cy c n node, nh vy c n! cch duyt cy khc nhau.
Tuy nhin, a s cc php duyt cy khng hu ch.
i vi cy tng qut, c 2 cch duyt cy thng thng:
Phng php duyt cy theo chiu rng (Breadth-first traversal)
Phng php duyt cy theo chiu su (Depth-first traversal).
Vi mt cy c n node, phc tp s l O(n).

126
7.7. CY V NG DNG (10/41)
7.7.3. Cc phng php duyt cy (2/11)
Mt s thao tc khi duyt cy:
Xem tt c cc node trn cy.
Tm phn t ln nht hay nh nht trn cy.
Xc nh s node c trn cy.
Sao chp cy.
...
127
7.7. CY V NG DNG (11/43)
7.7.3. Cc phng php duyt cy (3/11)
Cc thao tc chnh khi duyt cy:
N: Duyt node ang xt.
L: Duyt cy con bn tri ca node ang xt.
R: Duyt cc cy con cn li ca node ang xt.
Vi cc thao trn, c 3 cch c bn:
Duyt tin th t (Preorder): NLR
Duyt trung th t (Inorder): LNR
Duyt hu th t (Postorder): LRN
128
7.7. CY V NG DNG (12/43)
7.7.3. Cc phng php duyt cy (4/11)
Duyt tin th t (Preorder): NLR
1. Thm node ang xt trc cc node con ca n.
2. Cc node con c thm theo th t t tri qua phi.
3. Vi mi node con, vic thm c thc hin theo dng
tin th t.
129
7.7. CY V NG DNG (13/43)
7.7.3. Cc phng php duyt cy (5/11)
Duyt tin th t (Preorder): NLR










Th t duyt: A B G H I C E F D

130
Preorder(node)
1. Thm node.
2. Vi mi con k ca node:
Preorder(k)
A
B C D
G H I E F
1
2
3 4 5
6
7 8
9
7.7. CY V NG DNG (14/43)
7.7.3. Cc phng php duyt cy (6/11)
Duyt trung th t (Inorder): LNR
1. Thm con th nht ca node ang xt dng trung th t.
2. Thm node ang xt.
3. Thm cc con cn li ca node ang xt dng trung th t.
131
7.7. CY V NG DNG (15/43)
7.7.3. Cc phng php duyt cy (7/11)
Duyt trung th t (Inorder): LNR










Th t duyt: G B H I A E C F D

132
Inorder(node)
1. Inorder(FirstChildren).
2. Thm node.
3. Vi mi con cn li k ca
node: Inorder(k)
A
B C D
G H I E F
5
2
1 3 4
7
6 8
9
7.7. CY V NG DNG (16/43)
7.7.3. Cc phng php duyt cy (8/11)
Duyt hu th t (Postorder): LRN
1. Thm con th nht ca node ang xt dng hu th t.
2. Thm cc con cn li ca node ang xt dng hu th t.
3. Thm node ang xt.
133
7.7. CY V NG DNG (17/43)
7.7.3. Cc phng php duyt cy (9/11)
Duyt hu th t (Postorder): LRN









Th t duyt: G H I B E F C D A

134
Postorder(node)
1. Postorder(FirstChildren).
2. Vi mi con cn li k ca
node: Postorder(k)
3. Thm node.
A
B C D
G H I E F
9
4
1 2 3
7
5 6
8
7.7. CY V NG DNG (18/43)
7.7.3. Cc phng php duyt cy (10/11)
Duyt cy theo chiu rng (Level-Order)
1. Thm cc node bt u t mc thp nht cho n cc mc
cao.
2. Ti mi mc, thm t tri sang phi.
3. S dng queue h tr trong qu trnh duyt cy.
4. Phng php ny cn c gi l Level-Order Traversal.
135
7.7. CY V NG DNG (19/43)
7.7.3. Cc phng php duyt cy (11/11)
Duyt cy theo chiu rng (Level-Order)

Th t duyt: A B C D G H I E F

136
A
B C D
G H I E F
1
2
5 6 7
3
8 9
4
7.7. CY V NG DNG (20/43)
7.6.4. Cy khung & thut ton xy dng cy khung (1/9)
nh ngha 7.6.4
Cho G l th v hng lin thng. Ta gi th con T ca G l mt
cy khung nu T tho mn hai iu kin:
a. T l mt cy;
b. Tp nh ca T bng tp nh ca G.


137
7.7. CY V NG DNG (21/43)
7.7.4. Cy khung & thut ton xy dng cy khung (2/9)
V d v cy khung
Cho th G:



Cc bc xy dng cy khung ca th G


138
7.7. CY V NG DNG (22/43)
7.7.4. Cy khung & thut ton xy dng cy khung (3/9)
tm mt cy bao trm trn th v hng lin thng, c th s
dng k thut tm kim theo chiu rng hoc tm kim theo chiu su
thc hin.
Gi s ta cn xy dng mt cy bao trm xut pht ti nh u no .
Vi hai trng hp, mi khi n c nh v (chuaxet[v] = true) t nh
u th cnh (u,v) c kt np vo cy bao trm.
2 k thut ny c th hin trong 2 th tc:
STREE_DFS(u)
STREE_BFS(v)

139
7.7. CY V NG DNG (23/43)
7.7.4. Cy khung & thut ton xy dng cy khung (4/9)
Gi m ca tm cy khung theo chiu su DFS

140
void STREE_DFS( int u){
/* Tm kim theo chiu su, p
dng cho bi ton xy dng cy
bao trm ca th v hng lin
thng G=<V, E>; cc bin chuaxet,
Ke, T l ton cc */
chuaxet[u] = true;
for ( v Ke(u) ) {
if ( chuaxet[v] ) {
T = T (u,v);
STREE_DFS(v);
}
}
}
/* trong chng trnh chnh */
{
for ( u V )
chuaxet[u] = true;
T = ;
STREE_DFS( gc );
/* root l mt nh no ca
th */
}
7.7. CY V NG DNG (24/43)
7.7.4. Cy khung & thut ton xy dng cy khung (5/9)
Gi m ca tm cy khung theo chiu rng BFS

141
void STREE_BFS(int u){
QUEUE = ;
QUEUE <= u;
/* a u vo hng i */
chuaxet[u] = false;
while (QUEUE ) {
v <= QUEUE;
/* ly v khi hng i */
for ( p Ke(v) ) {
if (chuaxet[u]) {
QUEUE <= u;
chuaxet[u] = false;
T = T (v, p);
}
}
}
}
/* trong chng trnh chnh */
{
for ( u V )
chuaxet[u] = true;
T = ;
STREE_BFS( gc );
}
7.7. CY V NG DNG (25/43)
7.7.4. Cy khung & thut ton xy dng cy khung (6/9)
V d v to cy khung theo DFS v BFS

142
Kt qu theo BFS, xut
pht t nh 1
Cnh: 1-2
Cnh: 1-3
Cnh: 1-4
Cnh: 1-6
Cnh: 2-5
Kt qu theo DFS, xut
pht t nh 1
Cnh: 1-2
Cnh: 2-3
Cnh: 3-4
Cnh: 4-5
Cnh: 3-6
7.7. CY V NG DNG (26/43)
7.7.4. Cy khung & thut ton xy dng cy khung (7/9)
Chng trnh minh ha v to cy khung theo DFS v BFS

143
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int CK[MAX][2], n, G[MAX][MAX],
chuaxet[MAX], socanh, QUEUE[MAX];
void Init(void){
int i, j;
FILE *fp;
fp= fopen("DOTHI.IN", "r");
if(fp==NULL){
cout<<"\n Khong co file";
getch(); return;
}
fscanf(fp,"%d",&n);
cout<<"\n So dinh do thi:"<<n;
cout<<"\n Ma tran ke:";
for(i=1; i<=n; i++){
cout<<"\n";
for(j=1; j<=n; j++){
fscanf(fp,"%d",&G[i][j]);
cout<<" "<<G[i][j];
}
}
fclose(fp);
for (i=1; i<=n;i++)
chuaxet[i]=TRUE;
}
void STREE_DFS(int i){
int j;
if(socanh==n-1) return;
for(j=1; j<=n; j++){
if (chuaxet[j] && G[i][j]){
chuaxet[j]=FALSE;
socanh++;
7.7. CY V NG DNG (27/43)
7.7.4. Cy khung & thut ton xy dng cy khung (8/9)
Chng trnh minh ha v to cy khung theo DFS v BFS

144
CK[socanh][1]=i;
CK[socanh][2]=j;
if(socanh==n-1) return;
STREE_DFS(j);
}
}
}
void Result(void){
int i, j;
for(i=1; i<=socanh; i++){
cout<<"\n Canh "<<i;
for(j=1; j<=2; j++)
cout<<" "<<CK[i][j];
}
getch();
}
void STREE_BFS(int u){
int dauQ, cuoiQ, v, p;
dauQ=1; cuoiQ=1;
QUEUE[dauQ]=u;
chuaxet[u]=FALSE;
while(dauQ<=cuoiQ){
v= QUEUE[dauQ]; dauQ=dauQ+1;
for(p=1; p<=n; p++){
if(chuaxet[p] && G[v][p]){
chuaxet[p]=FALSE;
socanh++;
CK[socanh][1]=v;
CK[socanh][2]=p;
cuoiQ=cuoiQ+1;
QUEUE[cuoiQ]=p;
if(socanh==n-1) return;
}
}
}
}
7.7. CY V NG DNG (28/43)
7.7.4. Cy khung & thut ton xy dng cy khung (9/9)
Chng trnh minh ha v to cy khung theo DFS v BFS

145
void main(void){
int i=1; Init();
socanh=0;
chuaxet[i]=FALSE;
/* xy dng cy bao trm ti nh 1*/
STREE_DFS(i);
//STREE_BFS(i);
Result();
getch();
}
7.7. CY V NG DNG (29/43)
146
7.7.5. Cy khung nh nht (1/15)

7.7. CY V NG DNG (30/43)
7.7.5. Cy khung nh nht (2/15)
V d v mt s bi ton lin quan:
1. Bi ton ni mng my tnh.
Mt mng my tnh gm n my tnh c nh s t 1, 2,..., n. Bit chi
ph ni my i vi my j l c[i, j], i, j = 1, 2,..., n. Hy tm cch ni mng
sao cho chi ph l nh nht.
2. Bi ton xy dng h thng cable.
Gi s ta mun xy dng mt h thng cable in thoi ni n im ca
mt mng vin thng sao cho im bt k no trong mng u c
ng truyn tin ti cc im khc. Bit chi ph xy dng h thng
cable t im i n im j l c[i,j]. Hy tm cch xy dng h thng
mng cable sao cho chi ph l nh nht.
147
7.7. CY V NG DNG (31/43)
148
7.7.5. Cy khung nh nht (3/15)
7.7. CY V NG DNG (32/43)
7.7.5. Cy khung nh nht (4/15)
thc hin vic tm cy khung nh nht, thng s dng:
Thut ton KRUSKAL
Thut ton PRIM
Trong phn ny, nghin cu 2 phng php chnh trn
149
7.7. CY V NG DNG (33/43)
150
7.7.5. Cy khung nh nht (6/15)
7.7.5.1. Thut ton KRUSKAL (2/6)
7.7. CY V NG DNG (34/43)
7.7.5. Cy khung nh nht (6/15)
7.7.5.1. Thut ton KRUSKAL (2/6)
Gi m thut ton Kruskal

151
void Kruskal(void){
T = ;
while ( |T| < (n-1) && ( E ) ){
Chn cnh e E l cnh c di nh nht;
E = E \ {e};
if (T {e}: khng to nn chu trnh )
T = T {e};
}
if ( |T| < n-1)
th khng lin thng;
}
7.7. CY V NG DNG (35/43)
7.7.5. Cy khung nh nht (7/15)
7.7.5.1. Thut ton KRUSKAL (3/6)
V d v thut ton Kruskal

Cho th nh hnh v bn, tm cy khung nh nht theo Kruskal
152
1
2
3
4
5
6 1
2
2
3
5
THUT TON KRUSKAL
153
7.7. CY V NG DNG (36/43)
7.7.5. Cy khung nh nht (8/15)
7.7.5.1. Thut ton KRUSKAL (4/6)
Chng trnh minh ha thut ton Kruskal
154
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define MAX 50
#define TRUE 1
#define FALSE 0
int n, m, minl, connect;
int dau[500],cuoi[500], w[500];
int daut[50], cuoit[50],
father[50];
void Init(void){
int i;
FILE *fp;
fp=fopen("dothi.in","r");
fscanf(fp, "%d%d", &n,&m);
cout<<"\n So dinh do thi:"<<n;
cout<<"\n So canh do thi:"<<m;
cout<<"\n DS ke do thi:";
for(i=1; i<=m; i++){
fscanf(fp, "%d%d%d", &dau[i],
&cuoi[i], &w[i]);
cout<<"\n Canh "<<
i<<":"<<dau[i]<<" "<<cuoi[i]<<"
"<<w[i];
}
fclose(fp);
getch();
}
void Heap(int First, int Last){
int j, k, t1, t2, t3;
j=First;
while(j<=(Last/2)){
if( (2*j)<Last && w[2*j +
1]<w[2*j])
k = 2*j +1;
else
k=2*j;
7.7. CY V NG DNG (37/43)
7.7.5. Cy khung nh nht (9/15)
7.7.5.1. Thut ton KRUSKAL (5/6)
Chng trnh minh ha thut ton Kruskal (tip)
155
if(w[k]<w[j]){
t1=dau[j];
t2=cuoi[j];
t3=w[j];
dau[j]=dau[k];
cuoi[j]=cuoi[k];
w[j]=w[k];
dau[k]=t1;
cuoi[k]=t2;
w[k]=t3;
j=k;
}
else j=Last;
}
}
int Find(int i){
int tro=i;
while(father[tro]>0)
tro=father[tro];
return(tro);
}
void Union(int i, int j){
int x = father[i]+father[j];
if(father[i]>father[j]) {
father[i]=j;
father[j]=x;
}
else {
father[j]=i;
father[i]=x;
}
}
void Krusal(void){
int i, last, u, v, r1, r2,
ncanh, ndinh;
for(i=1; i<=n; i++)
father[i]=-1;
7.7. CY V NG DNG (38/43)
7.7.5. Cy khung nh nht (10/15)
7.7.5.1. Thut ton KRUSKAL (6/6)
Chng trnh minh ha thut ton Kruskal (tip)
156
for(i= m/2;i>0; i--)
Heap(i,m);
last=m; ncanh=0;
ndinh=0;minl=0;connect=TRUE;
while(ndinh<n-1 && ncanh<m){
ncanh=ncanh+1;
u=dau[1]; v=cuoi[1];
r1= Find(u); r2= Find(v);
if(r1!=r2) {
ndinh=ndinh+1;
Union(r1,r2);
daut[ndinh]=u;
cuoit[ndinh]=v;
minl=minl+w[1];
}
dau[1]=dau[last];
cuoi[1]=cuoi[last];
w[1]=w[last];
last=last-1;
Heap(1, last); }
if(ndinh!=n-1) connect=FALSE;
}
void Result(void){
int i;
cout<<"\n Do dai cay khung nho
nhat: "<<minl;
cout<<"\n Cac canh cua cay
khung nho nhat:";
for(i=1; i<n; i++)
cout<<"\n "<<daut[i]<<"
"<<cuoit[i]; cout<<"\n";
}
void main(void){
Init();
Krusal();
Result(); getch();
}
7.7. CY V NG DNG (39/43)
7.7.5. Cy khung nh nht (11/15)
7.7.5.2. Thut ton PRIM (1/5)
Thut ton Prim cn c mang tn l ngi lng ging gn nht.
Trong thut ton ny, bt u ti mt nh tu s ca th, ni s vi
nh y sao cho trng s cnh c[s, y] l nh nht.
Tip theo, t nh s hoc y tm cnh c di nh nht, iu ny dn
n nh th ba z v thu c cy b phn gm 3 nh 2 cnh.
Qu trnh c tip tc cho ti khi ta nhn c cy gm n-1 cnh,
chnh l cy khung nh nht cn tm.
157
7.7. CY V NG DNG (40/43)
7.7.5. Cy khung nh nht (12/15)
7.7.5.2. Thut ton PRIM (2/5)
Gi m thut ton Prim

158
void Prim (void){
/*bc khi to*/
Chn s l mt nh no ca
th;
V
H
={s}; T=; d[s]=0; near[s]=s;
for ( v V\V
H

) {
D[v] = C[s, v]; near[v] = s;
}
/* Bc lp */
Stop = False;
while ( not stop ) {
Tm u V\V
H

tho mn: d[u] =
min { d[v] vi uV\V
H
};
V
H

= V
H
{u};
T = T (u, near[u] );
if ( | V
H

|) == n ) {
H = <V
H
, T> l cy khung
nh nht ca th;
Stop = TRUE;
}
else {
for ( v V\V
H

) {
if (d[v] > C[u, v]) {
D[v] = C[u, v];
Near[v] = u;
}
}
}
}
}
7.7. CY V NG DNG (41/43)
7.7.5. Cy khung nh nht (13/15)
7.7.5.1. Thut ton PRIM (3/3)
V d v thut ton Prim

Cho th nh hnh v bn, tm cy khung nh nht theo Prim
159
1
2
3
4
5
6 1
2
2
3
5
7.7. CY V NG DNG (42/43)
7.7.5. Cy khung nh nht (14/15)
7.7.5.2. Thut ton PRIM (4/5)
Chng trnh minh ha thut ton Prim

160
#include "conio.h"
#include "io.h"
#include "iostream"
using namespace std;
#define TRUE 1
#define FALSE 0
#define MAX 10000
int a[100][100];
int n,m, i,sc,w;
int chuaxet[100];
int cbt[100][3];
void Init(void){
int p,i,j,k;
FILE *fp;
for(i=1; i<=n; i++)
for(j=1; j<=n;j++)
a[i][j]=0;
fp=fopen("dothi.in","r");
fscanf(fp,"%d%d",&n,&m);
cout<<"\n So dinh: "<<n;
cout<<"\n So canh: "<<m;
cout<<"\n Danh sach canh:";
for(p=1; p<=m; p++){
fscanf(fp,"%d%d%d",&i,&j,&k);
cout<<"\n "<<i<<" "<<j<<"
"<<k;
a[i][j]=k;
a[j][i]=k;
}
for (i=1; i<=n; i++){
cout<<"\n";
for (j=1; j<=n; j++){
if (i!=j && a[i][j]==0)
a[i][j]=MAX;
cout<<" "<<a[i][j];
}
}
fclose(fp); getch(); }
7.7. CY V NG DNG (43/43)
7.7.5. Cy khung nh nht (15/15)
7.7.5.2. Thut ton PRIM (5/5)
Chng trnh minh ha thut ton Prim

161
void Result(void){
for(i=1;i<=sc; i++)
cout<<"\n "<<cbt[i][1];
cout<<" "<<cbt[i][2];
}
void PRIM(void){
int i,j,k,top,min,l,t,u;
int s[100];
sc=0;w=0;u=1;
for(i=1; i<=n; i++)
chuaxet[i]=TRUE;
top=1;s[top]=u;
chuaxet[u]=FALSE;
while (sc<n-1) {
min=MAX;
for (i=1; i<=top; i++){
t=s[i];
for(j=1; j<=n; j++){
if (chuaxet[j] &&
min>a[t][j]){
min=a[t][j];
k=t;l=j; } } }
sc++;w=w+min;
cbt[sc][1]=k;cbt[sc][2]=l;
chuaxet[l]=FALSE;a[k][l]=MAX;
a[l][k]=MAX;top++;s[top]=l;
cout<<"\n"; } }
void main(void){
Init();
PRIM();
cout<<"\n Do dai ngan nhat:
"<<w;
for(i=1;i<=sc; i++)
cout<<"\n "<<cbt[i][1]<<"
"<<cbt[i][2];
getch();
}

You might also like