You are on page 1of 38

PHN II.

L THUYT TH
CHNG 5. NHNG KHI NIM C BN CA TH
Ni dung chnh ca chng ny cp n nhng khi nim c bn nht ca th, phng php biu din thi
trn my tnh v mt s khi nim lin quan.
Cc loi th v hng, th c hng, a th
Khi nim v bc ca nh, ng i, chu trnh v tnh lin thng ca th.
Biu din th bng ma trn k.
Biu din th bng danh sch k.
Biu din th bng danh sch cnh.
Bn c c th tm thy nhng kin thc su hn v rng hn trong cc ti liu [1], [2], [3].
5.1. nh ngha v khi nim
L thuyt th l lnh vc nghin cu tn ti t nhng nm u ca th k 18 nhng li c nhng ng dng
hin i. Nhng t tng c bn ca l thuyt th c nh ton hc ngi Thu S Leonhard Euler xut v
chnh ng l ngi dng l thuyt th gii quyt bi ton ni ting Cu Konigsberg.
th c s dng gii quyt nhiu bi ton thuc cc lnh vc khc nhau. Chng hn, ta c th dng th
biu din nhng mch vng ca mt mch in, dng th biu din qu trnh tng tc gia cc loi trong th
gii ng thc vt, dng th biu din nhng ng phn ca cc hp cht polyme hoc biu din mi lin h gia
cc loi thng tin khc nhau. C th ni, l thuyt th c ng dng rng ri trong tt c cc lnh vc khc nhau
ca thc t cng nh nhng lnh vc tru tng ca l thuyt tnh ton.
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 cnh ni gia cc cp nh ca th. minh chng cho cc loi
th, chng ta xem xt mt s v d v cc loi mng my tnh bao gm: mi my tnh l mt nh, mi cnh l nhng
knh in thoi c ni gia hai my tnh vi nhau. Hnh 6.1, l s ca mng my tnh loi 1.
San Francisco

Detroit
Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.1. Mng my tnh n knh thoi.


Trong mng my tnh ny, mi my tnh l mt nh ca th, mi cnh v hng biu din cc nh ni hai
nh phn bit, khng c hai cp nh no ni cng mt cp nh. Mng loi ny c th biu din bng mt n
th v hng.
nh ngha 1. n th v hng G = <V, E> bao gm V l tp cc nh, E l tp cc cp c th t gm hai
phn t khc nhau ca V gi l cc cnh.
Trong trng hp gia hai my tnh no thng xuyn truyn ti nhiu thng tin, ngi ta ni hai my tnh
bi nhiu knh thoi khc nhau. Mng my tnh a knh thoi c th c biu din nh hnh 5.2.
San Francisco

Detroit
Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.2. Mng my tnh a knh thoi.


Trn hnh 5.2, gia hai my tnh c th c ni vi nhau bi nhiu hn mt knh thoi. Vi mng loi ny,
chng ta khng th dng n th v hng biu din. th loi ny l a th v hng.
nh ngha 2. a th v hng G = <V, E> bao gm V l tp cc nh, E l h cc cp khng c th t gm
hai phn t khc nhau ca V gi l tp cc cnh. e1, e2 c gi l cnh lp nu chng cng tng ng vi mt cp
nh.
R rng, mi n th u l a th, nhng khng phi a th no cng l n th v gia hai nh c
th c nhiu hn mt cnh ni gia chng vi nhau. Trong nhiu trng hp, c my tnh c th ni nhiu knh
thoi vi chnh n. Vi loi mng ny, ta khng th dng a th biu din m phi dng gi th v hng.
Gi th v hng c m t nh trong hnh 5.3.
nh ngha 3. Gi th v hng G = <V, E> bao gm V l tp nh, E l h cc cp khng c th t gm hai
phn t (hai phn t khng nht thit phi khc nhau) trong V c gi l cc cnh. Cnh e c gi l khuyn nu
c dng e =(u, u), trong u l nh no thuc V.
San Francisco

Detroit
Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.3. Mng my tnh a knh thoi c khuyn.


Trong nhiu mng, cc knh thoi ni gia hai my tnh c th ch c php truyn tin theo mt chiu. Chng
hn my tnh t ti San Francisco c php truy nhp ti my tnh t ti Los Angeles, nhng my tnh t ti Los
Angeles khng c php truy nhp ngc li San Francisco. Hoc my tnh t ti Denver c th truy nhp c
ti my tnh t ti Chicago v ngc li my tnh t ti Chicago cng c th truy nhp ngc li my tnh ti
Denver. m t mng loi ny, chng ta dng khi nim n th c hng. n th c hng c m t
nh trong hnh 5.4.

San Francisco

Detroit
Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.4. Mng my tnh c hng.


nh ngha 4. n th c hng G = <V, E> bao gm V l tp cc nh, E l tp cc cp c th t gm hai
phn t ca V gi l cc cung.
th c hng trong hnh 5.4 khng cha cc cnh bi. Nn i vi cc mng a knh thoi mt chiu, th
c hng khng th m t c m ta dng khi nim a th c hng. Mng c dng a th c hng c
m t nh trong hnh 5.5.
San Francisco

Detroit
Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.5. Mng my tnh a knh thoi mt chiu.


nh ngha 5. a th c hng G = <V, E> bao gm V l tp nh, E l cp c th t gm hai phn t ca
V c gi l cc cung. Hai cung e1, e2 tng ng vi cng mt cp nh c gi l cung lp.
T nhng dng khc nhau ca th k trn, chng ta thy s khc nhau gia cc loi th c phn bit
thng qua cc cnh ca th c th t hay khng c th t, cc cnh bi, khuyn c c dng hay khng. Ta c
th tng kt cc loi th thng qua bng 1.
Bng 1. Phn bit cc loi th
Loi th

Cnh

C cnh bi

C khuyn

1.

n th v hng

V hng

Khng

Khng

2.

a th v hng

V hng

Khng

3.

Gi th v hng

V hng

4.

th c hng

C hng

Khng

5.

a th c hng

C hng

5.2. Cc thut ng c bn
nh ngha 1. 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 2. Ta gi bc ca nh v trong th v hng l s cnh lin thuc vi n v k hiu l deg(v).
b

Hnh 5.6 th v hng G.


V d 1. Xt th trong hnh 6.6, 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.
nh l 1. Gi s G = <V, E> l th v hng vi m cnh. Khi 2m =

deg(v) .
vV

Chng minh. R rng mi cnh e=(u,v) bt k, c tnh mt ln trong deg(u) v mt ln trong deg(v). T
suy ra s tng tt c cc bc bng hai ln s cnh.
H qu. Trong th v hng G=<V, E>, s cc nh bc l l mt s chn.
Chng minh. Gi O l tp cc nh bc chn v V l tp cc nh bc l. T nh l 1 ta suy ra:

2m = deg(v) = deg(v ) + deg(v )


vV

vO

vU

Do deg(v) l chn vi v l nh trong O nn tng th hai trong v phi cng l mt s chn.


nh ngha 3. 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 4. Ta gi bn bc ra (bn bc vo) ca nh v trong th c hng l s cung ca th i ra khi
n (i vo n) v k hiu l deg+(v) v deg-(v).

Hnh 5.7. th c hng G.


V d 2. Xt th c hng trong hnh 5.7, 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.
Do mi cung (u,v) c tnh mt ln trong bn bc vo ca nh v v mt ln trong bn bc ra ca nh u nn ta
c:
nh l 2. Gi s G = <V, E> l th c hng. Khi

deg
vV

(v ) = deg (v ) =| E |
vV

Rt nhiu tnh cht ca th c hng khng ph thuc vo hng trn cc cung ca n. V vy, trong nhiu
trng hp, ta b qua cc hng trn cung ca th. th v hng nhn c bng cch b qua hng trn cc
cung c gi l th v hng tng ng vi th c hng cho.
5.3. ng i, chu trnh, th lin thng
nh ngha 1. ng i di n t nh u n nh v trn th v hng G=<V,E> l dy

x0, x1, . . ., xn-1, xn


trong n l s nguyn dng, x0=u, xn=v, (xi, xi+1)E, i =0, 1, 2, . . ., n-1
ng i nh trn cn c th biu din thnh dy cc cnh
(x0, x1), (x1,x2) , . . ., (xn-1, xn).
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.
V d 1. Tm cc ng i, chu trnh trong th v hng nh trong hnh 5.8.
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.
a
b
c
d

Hnh 5.8. ng i trn th.


Khi nim ng i v chu trnh trn th c hng c nh ngha hon ton tng t, ch c iu khc bit
duy nht l ta phi ch ti cc cung ca th.
nh ngha 2. ng i di n t nh u n nh v trong th c hng G=<V,A> l dy
x0, x1, . . ., xn
trong , n l s nguyn dng, u = x0, v = xn, (xi, xi+1) A.
ng i nh trn c th biu din thnh dy cc cung :
(x0, x1), (x1, x2), . . ., (xn-1, xn).
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.
nh ngha 3. th v hng c gi l lin thng nu lun tm c ng i gia hai nh bt k ca n.
Trong trng hp th G=<V, E> khng lin thng, ta c th phn r G thnh mt s th con lin thng m
chng i mt khng c nh chung. Mi th con nh vy c gi l mt thnh phn lin thng ca G.
V d 2. Tm cc thnh phn lin thng ca th 5.9 di y.
2

6
8
7

4
3

11

10
9

13
12
Hnh 5.9. th v hng G
S thnh phn lin thng ca G l 3. 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.
5.4. Biu din th trn my tnh
5.4.1.

Ma trn k, ma trn trng s

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. V vy, la chn cu trc d liu thch hp biu din th s ph thuc vo
tng bi ton c th.

Xt th n v hng G =<V, E>, vi tp nh V = {1, 2, . . ., n}, tp cnh E = {e1, e2,.., em}. Ta gi ma


trn k ca th G l ma trn c cc phn t hoc bng 0 hoc bng 1 theo qui nh nh sau:
A = { aij: aij = 1 nu (i, j) E, aij = 0 nu (i,j) E; i, j =1, 2, . . ., n}.
V d 1. Biu din th trong hnh 5.10 di y bng ma trn k.
2

6
3

Hnh 5.10. th v hng G

Tnh cht ca ma trn k:


a)

Ma trn k ca th v hng l ma trn i xng A[i,j] = A[j, i]; i, j = 1, 2, . . . n. Ngc li, mi (0, 1) ma
trn cp n ng cu vi mt n th v hng n nh;

b)
c)

Tng cc phn t theo dng i ( ct j) ca ma trn k chnh bng bc nh i (nh j);


p
Nu k hiu a ij , i , j =1,2,..., n l cc phn t ca ma trn. Khi ,
p
Ap = A.A. . . A (p ln); a ij , i, j =1,2,..., n ,

cho ta s ng i khc nhau t nh i n nh j qua p-1 nh trung gian.


Ma trn k ca th c hng cng c nh ngha hon ton tng t, chng ta ch cn lu ti hng ca
cnh. Ma trn k ca th c hng l khng i xng.
V d 2. Tm ma trn k ca th c hng trong hnh 5.11.
1

5
3

Hnh 5.11. th c hng G


Trong rt nhiu ng dng khc nhau ca l thuyt th, mi cnh e =(u,v) ca n c gn bi mt s c(e) =
V d 3. Ma trn k ca th c trng s trong hnh 5.12.
2
3

6
6

4
8

6
7

9
3

Hnh 5.12. th trng s G.

u im ca 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 ln
nht ca n l bt k th c bao nhiu cnh ta u mt n2 n v b nh lu tr th.
5.4.2.

Danh sch cnh (cung )

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, chng ta s 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]. Nh vy, lu tr th, ta cn 2m
n v b nh. Nhc im ln nht ca phng php ny l nhn bit nhng cnh no k vi cnh no chng ta
cn m php so snh trong khi duyt qua tt c m cnh (cung) ca th. Nu l th c trng s, ta cn thm m
n v b nh lu tr trng s ca cc cnh.
V d 4. Danh sch cnh (cung) ca th v hng trong hnh 5.10, th c hng hnh 5.11, th trng s hnh
5.12.
Dau

Cuoi

Dau

Cuoi

Dau

Cuoi

Trongso

Danh sch cnh cung hnh 5.10

Hnh 5.11

Danh sch trng s hnh

5.12
5.4.3. Danh sch k
Trong rt nhiu ng dng, cch biu din th di dng danh sch k thng c s dng. Trong biu
din ny, vi mi nh v ca th chng ta lu tr danh sch cc nh k vi n m ta k hiu l Ke(v), ngha l
Ke(v) = { u V: (u, v)E},
Vi cch biu din ny, mi nh i ca th, ta lm tng ng vi mt danh sch tt c cc nh k vi n
v c k hiu l List(i). biu din List(i), ta c th dng cc kiu d liu kiu tp hp, mng hoc danh sch
lin kt.
V d 5. Danh sch k ca th v hng trong hnh 5.10, th c hng trong hnh 5.11 c biu din bng
danh sch k nh sau:
List(i)
nh

List(i)

nh

5.5.

Nhng im cn ghi nh
Nm vng v phn bit r cc loi th: n th, a th, th v hng, th c hng, th
trng s.
Nm vng nhng khi nim c bn v th: ng i, chu trnh, th lin thng.
Hiu v nm r bn cht ca cc phng php biu din th trn my tnh. Phn tch u, nhc im ca
tng phng php biu din.
Chuyn i cc phng php biu din qua li ln nhau gip ta hiu c cch biu din th trn my
tnh.
BI TP CHNG 5

Bi 1. Trong mt bui gp mt, mi ngi u bt tay nhau. Hy ch ra rng s lt ngi bt tay nhau l mt s
chn.
Bi 2. Mt n th vi n nh c nhiu nht l bao nhiu cnh?
Bi 3. Hy biu din cc th G1, G2, G3 di y di dng: ma trn k, danh sch cnh, danh sch k.
2

a. th v hng G1.
8

6
C

E
7

4
9

5
4

9
F

c. th trng s G3
Bi 4. Hy to mt file d liu theo khun dng nh sau:
a.

Ma trn k:
-

b. th c hng G2.

Dng u tin l s t nhin n l s cc nh ca th.

N dng k tip l ma trn k ca th.

b. Danh sch cnh:


-

Dng u tin ghi li s t nhin n v m l s cc nh v cc cnh ca th.

M dng k tip ghi li th t nh u, cui ca cc cnh.

Hy vit chng trnh chuyn i mt th cho di dng ma trn k thnh mt th cho di dng danh sch
cnh v danh sch k. Ngc li, chuyn i mt th cho di dng danh sch cnh thnh th di dng ma
trn k v danh sch cnh.
Bi 5. Mt bn c 88 c nh s theo cch sau:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

Mi c th coi l mt nh ca th. Hai nh c coi l k nhau nu mt con vua t ny c th


nhy sang kia sau mt bc i. V d : 1 k vi 2, 9, 10, 11 k vi 2, 3, 4, 10, 12, 18, 19, 20. Hy vit
chng trnh to ma trn k ca th, kt qu in ra file king.out.
Bi 6. Bn c 88 c nh s nh bi trn. Mi c th coi l mt nh ca th . Hai nh c gi l k nhau
nu mt con m t ny c th nhy sang kia sau mt nc i. V d 1 k vi 11, 18, 11 k vi 1, 5, 17, 21,
26, 28. Hy vit chng trnh lp ma trn k ca th, kt qu ghi vo file matran.out.

CHNG 6. CC THUT TON TM KIM TRN TH


C nhiu thut ton trn th c xy dng duyt tt c cc nh ca th sao cho mi nh c ving thm
ng mt ln. Nhng thut ton nh vy c gi l thut ton tm kim trn th. Chng ta cng s lm quen vi
hai thut ton tm kim c bn, l duyt theo chiu su DFS (Depth First Search) v duyt theo chiu rng BFS
(Breath First Search). Trn c s ca hai php duyt c bn, ta c th p dng chng gii quyt mt s bi ton
quan trng ca l thuyt th. Tm li, nhng ni dung chnh c cp trong chng ny bao gm:
Thut ton tm kim theo chiu su trn th.
Thut ton tm kim theo chiu rng trn th.
Tm cc thnh phn lin thng ca th.
Tm ng i gia hai nh bt k ca th.
Tm ng i v chu trnh Euler
Tm ng i v chu trnh Hamilton
Bn c c th tm hiu su hn v tnh ng n v phc tp ca cc thut ton trong cc ti liu [1] v [2].
6.1. Thut ton tm kim theo chiu su (DFS)
T tng c bn ca thut ton tm kim theo chiu su l bt u ti mt nh v0 no , chn mt nh u bt k k
vi v0 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.
kim tra vic duyt mi nh ng mt ln, chng ta s dng mt mng chuaxet[] gm n phn t (tng ng
vi n nh), nu nh th i c duyt, phn t tng ng trong mng chuaxet[] c gi tr FALSE. Ngc li, nu
nh cha c duyt, phn t tng ng trong mng c gi tr TRUE. Thut ton c th c m t bng th tc
qui DFS () trong : chuaxet - l mng cc gi tr logic c thit lp gi tr TRUE.
void DFS( int v){
Thm_nh(v); chuaxet[v] := FALSE;
for ( u ke(v) ) {
if (chuaxet[u] )
DFS(u);
}
}
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);
}
Ch : Thut ton tm kim theo chiu su d dng p dng cho th c hng. i vi th c hng,
chng ta ch cn thay cc cnh v hng bng cc cung ca th c hng.
V d . p dng thut ton tm kim theo chiu su vi th trong hnh sau:

6
8
7

10

11

9
13

12
Hnh 6.1. th v hng G.
nh bt u duyt

Cc nh duyt

Cc nh cha duyt

DFS(1)

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13

DFS(2)

1, 2

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13

DFS(4)

1, 2, 4

3, 5, 6, 7, 8, 9, 10, 11, 12, 13

DFS(3)

1,2,4, 3

5, 6, 7, 8, 9, 10, 11, 12, 13

DFS(6)

1,2,4,3, 6

5, 7, 8, 9, 10, 11, 12, 13

DFS(7)

1,2,4,3, 6,7

5, 8, 9, 10, 11, 12, 13

DFS(8)

1,2,4,3, 6,7,8

5, 9, 10, 11, 12, 13

DFS(10)

1,2,4,3, 6,7,8,10

5, 9, 11, 12, 13

DFS(5)

1,2,4,3, 6,7,8,10,5

9, 11, 12, 13

DFS(9)

1,2,4,3, 6,7,8,10,5,9

11, 12, 13

DFS(13)

1,2,4,3, 6,7,8,10,5,9,13

11, 12

DFS(11)

1,2,4,3, 6,7,8,10,5,9,13,11

12

DFS(11)

1,2,4,3, 6,7,8,10,5,9,13,11,12

Kt qu duyt:

1, 2, 4, 3, 6, 7, 8, 10, 5, 9, 13, 11, 12

Di y l vn bn chng trnh. Trong cc hm :


void Init(int G[][MAX], int *n): dng c d liu l t tp DFS.IN l biu din ca th di dng ma
trn k nh cp trong bi tp 5.4. A l ma trn vung lu tr biu din ca th
void DFS(int G[][MAX], int n, int v, int chuaxet[]): l thut ton duyt theo chiu su vi th G gm n
nh v nh bt u duyt l v.
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <dos.h>

#define MAX

100

#define TRUE 1
#define FALSE 0
/* Depth First Search */
void Init(int G[][MAX], int *n){
FILE *fp; int i, j;
fp=fopen("DFS.IN", "r");
if(fp==NULL){
printf("\n Khong co file input");
delay(2000);return;
}
fscanf(fp,"%d", n);
printf("\n So dinh do thi:%d",*n);
printf("\n Ma tran ke cua do thi:");
for(i=1; i<=*n;i++){
printf("\n");
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
printf("%3d", G[i][j]);
}
}
}
void DFS(int G[][MAX], int n, int v, int chuaxet[]){
int u;
printf("%3d",v);chuaxet[v]=FALSE;
for(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;
printf("\n\n");
for(i=1; i<=n;i++)

if(chuaxet[i])
DFS( G,n, i, chuaxet);
getch();
}
6.2. Thut ton tm kim theo chiu rng (Breadth First Search)
rng, 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 qui. Khc vi thut ton tm kim theo chiu
su, thut ton tm kim theo chiu rng thay th vic s dng stack bng hng i queue. Trong th tc ny, nh
c np vo hng i u tin l v, cc nh k vi v ( v1, v2, . . ., vk) c np vo queue k tip. Qu trnh duyt
tip theo c bt u t cc nh cn c mt trong hng i.
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. Th tc BFS di y th hin qu trnh thc hin ca thut ton:
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*/
Th tc BFS s thm tt c cc nh dng thnh phn lin thng vi u. thm tt c cc nh ca th, chng
ta ch cn thc hin on chng trnh di y:
{
for (u=1; un; u++)
chuaxet[u] = TRUE;
for (uV )
if (chuaxet[u] )
BFS(u);
}

V d. p dng thut ton tm kim theo chiu rng vi th trong hnh 6.2 sau:
2

6
8
7

10

11
12

9
13

Hnh 6.2. th v hng G=<V,E>

Cc nh duyt

Cc nh trong hng i

Cc nh cn li

1,2,3,4,5,6,7,8,9,10,11,12,13

2, 3, 11

4,5,6,7,8,9,10,12,13

1, 2

3, 11, 4, 6

5,7,8,9,10,12,13

1, 2, 3

11, 4, 6

5,7,8,9,10,12,13

1, 2, 3, 11

4, 6, 12, 13

5,7,8,9,10

1, 2, 3, 11, 4

6,12,13

5,7,8,9,10

1, 2, 3, 11, 4, 6

12,13, 7, 8

5,9,10

1, 2, 3, 11, 4, 6,12

13, 7, 8

5,9,10

1, 2, 3, 11, 4, 6,12, 13

7, 8, 9

5,10

1, 2, 3, 11, 4, 6,12, 13,7

8, 9

5, 10

1, 2, 3, 11, 4, 6,12, 13, 7, 8

9, 10

1, 2, 3, 11, 4, 6,12, 13, 7, 8, 9

10, 5

1,2,3,11, 4, 6,12, 13, 7, 8, 9,10

1,2,3,11,4,6,12,13,7, 8, 9,10, 5

Kt qu duyt: 1,2,3,11,4,6,12,13,7, 8, 9,10, 5.


Vn bn chng trnh ci t theo BFS c th hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <dos.h>
#define MAX

100

#define TRUE 1
#dine FALSE 0
/* 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){
printf("\n Khong co file input");
delay(2000);return;
}

fscanf(fp,"%d", n);
printf("\n So dinh do thi:%d",*n);
printf("\n Ma tran ke cua do thi:");
for(i=1; i<=*n;i++){
printf("\n");
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
printf("%3d", G[i][j]);
}
}
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];
printf("%3d",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);
printf("\n\n");
for(i=1; i<=n; i++)
chuaxet[i]= TRUE;
for(i=1; i<=n; i++)
if (chuaxet[i])

BFS(A, n, i, chuaxet, QUEUE);


getch();
}
6.3. Duyt cc thnh phn lin thng ca th
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().
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[].
Vi cch lm nh trn, th tc BFS() hoc DFS() c th c sa li nh sau:
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*/
}
}
}
}
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);

}
}
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>;
}
}
}
V d. th v hng trong hnh 6.3 s cho ta kt qu trong mng chuaxet nh sau:
1

7
9

Hnh 6.3. th v hng G=<V,E>.


S thnh phn lin thng

Kt qu thc hin BFS

Gi tr trong mng chuaxet[]

Cha thc hin

Chuaxet[] = {0,0,0,0,0,0,0,0,0}

BFS(1): 1, 2, 4, 5

Chuaxet[] = {1,1,0,1,1,0,0,0,0}

BFS(3) : 3, 6, 7

Chuaxet[] = {1,1,2,1,1,2,2,0,0}

BFS(8) : 8, 9

Chuaxet[] ={ 1,1,2,1,1,2,2,3,3}

Nh vy, 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.

Vn bn chng trnh c th hin nh sau:


#include <stdio.h>
#include <conio.h>
#include <io.h>

#include <stdlib.h>
#include <dos.h>
#define MAX

100

#define TRUE 1
#define FALSE 0
/* Breadth First Search */
void Init(int G[][MAX], int *n, int *solt, int *chuaxet){
FILE *fp; int i, j;
fp=fopen("lienth.IN", "r");
if(fp==NULL){
printf("\n Khong co file input");
delay(2000);return;
}
fscanf(fp,"%d", n);
printf("\n So dinh do thi:%d",*n);
printf("\n Ma tran ke cua do thi:");
for(i=1; i<=*n;i++){
printf("\n");
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &G[i][j]);
printf("%3d", G[i][j]);
}
}
for(i=1; i<=*n;i++)
chuaxet[i]=0;
*solt=0;
}
void Result(int *chuaxet, int n, int solt){
printf("\n\n");
if(solt==1){
printf("\n Do thi la lien thong");
getch(); return;
}
for(int i=1; i<=solt;i++){
printf("\n Thanh phan lien thong thu %d:",i);
for(int j=1; j<=n;j++){

if( chuaxet[j]==i)
printf("%3d", 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;
while(dauQ<=cuoiQ){
u=QUEUE[dauQ];printf("%3d",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;
clrscr();Init(G, &n,&solt, chuaxet);
printf("\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();
}
6.4. Tm ng i gia hai nh bt k ca th
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 .

Th tc BFS(s) hoc DFS(s) cho php ta duyt cc nh cng mt thnh phn lin thng vi s. Nh vy, nu
trong s cc nh lin thng vi s cha t th chc chn c ng i t s n t. Nu trong s cc nh lin thng vi s
khng cha t th khng tn ti ng i t s n t. Do vy, chng ta ch cn gi ti th tc DFS(s) hoc BFS(s) v
kim tra xem nh t c thuc thnh phn lin thng vi s hay khng. iu ny c thc hin n gin 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.
ghi nhn ng i t s n t, ta s dng mt mng truoc[] thit lp gi tr ban u l 0. Trong qu trnh
duyt, ta 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);
}
}
}
i vi th tc BFS(v) c thay i li nh sau:
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*/
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>;
}

V d. Tm ng i t nh 1 n nh 7 bng thut ton tm kim theo chiu rng vi th trong hnh 6.4
di y
2

6
8
7

10

11
12

9
13

Hnh 6.4. th v hng G=<V,E>


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 ta 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.
Ton vn chng trnh c th hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <dos.h>
#define MAX

100

#define TRUE

#define FALSE

0int n, truoc[MAX], chuaxet[MAX], queue[MAX];

int A[MAX][MAX]; int s, t;


/* Breadth First Search */
void Init(void){
FILE *fp; int i, j;
fp=fopen("lienth.IN", "r");
if(fp==NULL){
printf("\n Khong co file input");
delay(2000);return;
}
fscanf(fp,"%d", &n);
printf("\n So dinh do thi:%d",n);
printf("\n Ma tran ke cua do thi:");

for(i=1; i<=n;i++){
printf("\n");
for(j=1; j<=n;j++){
fscanf(fp,"%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
for(i=1; i<=n;i++){
chuaxet[i]=TRUE;
truoc[i]=0;
}
}
void Result(void){
printf("\n\n");
if(truoc[t]==0){
printf("\n Khong co duong di tu %d den %d",s,t);
getch();
return;
}
printf("\n Duong di tu %d den %d la:",s,t);
int j = t;printf("%d<=", t);
while(truoc[j]!=s){
printf("%3d<=",truoc[j]);
j=truoc[j];
}
printf("%3d",s);
}
void In(void){
printf("\n\n");
for(int i=1; i<=n; i++)
printf("%3d", truoc[i]);
}
void BFS(int s) {
int dauQ, cuoiQ, p, u;printf("\n");
dauQ=1;cuoiQ=1; queue[dauQ]=s;chuaxet[s]=FALSE;
while (dauQ<=cuoiQ){
u=queue[dauQ]; dauQ=dauQ+1;

printf("%3d",u);
for (p=1; p<=n;p++){
if(A[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){
clrscr();
printf("\n Dinh dau:"); scanf("%d",&s);
printf("\n Dinh cuoi:"); scanf("%d",&t);
Init();printf("\n");BFS(s);
n();getch();
Result();getch();
}
6.5. ng i v chu trnh Euler
nh ngha. 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.
R rng, mi th Euler u l na Euler nhng iu ngc li khng ng.
V d 1. Xt cc th G1, G2, G3 trong hnh 6.5.
a

e
d

e
c

G1

G2

G3

Hnh 6.5. th v hng G1, G2, G3.


th G1 l th Euler v 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.
V d 2. Xt cc th c hng H1, H2, H3 trong hnh 6.6.
a

c
c

H1

d
H2

c
H3

Hnh 6.6. th c hng H1, H2, H3.


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 chu trnh Euler.
nh l. 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.
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.
Th tc Euler_Cycle sau s cho php ta tm chu trnh Euler.
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;*/
}

V d. Tm chu trnh Euler trong hnh 6.7.

b
4

5
9

10

Hnh 6.7. th v hng G.


Cc bc thc hin theo thut ton s cho ta kt qu sau:
Bc

Gi tr trong stack

Gi tr trong CE

Cnh cn li

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

f, a

2, 3, 4, 5, 6, 7, 8, 9, 10

f, a, c

3, 4, 5, 6, 7, 8, 9, 10

f,a,c,f

3, 4, 5, 6, 7, 9, 10

f, a, c

3, 4, 5, 6, 7, 9, 10

f, a, c, b

3, 4, 6, 7, 9, 10

f, a, c, b, d

3, 4, 7, 9, 10

f, a, c, b, d,c

3, 4, 7, 10

f, a, c, b, d

f, c

3, 4, 7, 10

10

f, a, c, b, d, e

f, c

3, 4, 7

11

f, a, c, b, d, e, b

f, c

3, 4

12

f, a, c, b, d, e, b, a

f, c

13

f, a, c, b, d, e, b, a, d

f, c

14

f, a, c, b, d, e, b, a

f, c, d

15

f, a, c, b, d, e, b

f,c,d,a

16

f, a, c, b, d, e

f,c,d,a,b

17

f, a, c, b, d

f,c,d,a,b,e

18

f, a, c, b

f,c,d,a,b,e,d

19

f, a, c

f,c,d,a,b,e,d,b

20

f, a

f,c,d,a,b,e,d,b,c

21

f,c,d,a,b,e,d,b,c,a

22

f,c,d,a,b,e,d,b,c,a,f

Chng trnh tm chu trnh Euler c th hin nh sau:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

#include <dos.h>
#define MAX 50
#define

TRUE

#define FALSE

1
0

int A[MAX][MAX], n, u=1;


void Init(void){
int i, j;FILE *fp;
fp = fopen("CTEULER.IN", "r");
fscanf(fp,"%d", &n);
printf("\n So dinh do thi:%d",n);
printf("\n Ma tran ke:");
for(i=1; i<=n;i++){
printf("\n");
for(j=1; j<=n;j++){
fscanf(fp,"%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
fclose(fp);
}
int Kiemtra(void){
int i, j, s, d;
d=0;
for(i=1; i<=n;i++){
s=0;
for(j=1; j<=n;j++)
s+=A[i][j];
if(s%2) d++;
}
if(d>0) return(FALSE);
return(TRUE);
}
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 && A[v][x]==0)
x++;
if (x>n) {
dCE++; CE[dCE]=v; top--;
}
else {
top++; stack[top]=x;
A[v][x]=0; A[x][v]=0;
}
} while(top!=0);
printf("\n Co chu trinh Euler:");
for(x=dCE; x>0; x--)
printf("%3d", CE[x]);
}
void main(void){
clrscr(); Init();
if(Kiemtra())
Tim();
else printf("\n Khong co chu trinh Euler");
getch();
}
Mt th khng c chu trnh Euler nhng vn c th c ng i Euler. Khi , th c ng hai nh bc l,
tc l tng cc s cnh xut pht t mt trong hai nh l s l. Mt ng i Euler phi xut pht t mt trong
hai nh v kt thc nh kia. Nh vy, thut ton tm ng i Euler ch khc vi thut ton tm chu trnh
Euler ch ta phi xc nh im xut pht ca ng i t nh bc l ny v kt thc nh bc l khc. Chng
trnh tm ng i Euler c th hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define MAX 50
#define

TRUE

#define FALSE

1
0

void Init(int A[][MAX], int *n){


int i, j;FILE *fp;
fp = fopen("DDEULER.IN", "r");

fscanf(fp,"%d", n);
printf("\n So dinh do thi:%d",*n);
printf("\n Ma tran ke:");
for(i=1; i<=*n;i++){
printf("\n");
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
fclose(fp);
}
int Kiemtra(int A[][MAX], int n, int *u){
int i, j, s, d;
d=0;
for(i=1; i<=n;i++){
s=0;
for(j=1; j<=n;j++)
s+=A[i][j];
if(s%2){
d++;*u=i;
}
}
if(d!=2) return(FALSE);
return(TRUE);
}
void DDEULER(int A[][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 && A[v][x]==0)
x++;
if (x>n) {
dCE++; CE[dCE]=v; top--;
}

else {
top++; stack[top]=x;
A[v][x]=0; A[x][v]=0;
}
} while(top!=0);
printf("\n Co duong di Euler:");
for(x=dCE; x>0; x--)
printf("%3d", CE[x]);
}
void main(void){
int A[MAX][MAX], n, u;
clrscr(); Init(A, &n);
if(Kiemtra(A,n,&u))
DDEULER(A,n,u);
else printf("\n Khong co duong di Euler");
getch();
}
tm tt c cc ng i Euler ca mt th n nh, m cnh, ta c th dng k thut qui nh sau:
Bc 1. To mng b c di m + 1 nh mt ngn xp cha ng i. t b[0]=1, i=1 (xt nh th nht
ca ng i);
Bc 2. Ln lt 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 tng i ln 1 n v (xt nh tip theo) v quay li bc 2.

Nu i==m th dy b chnh l mt ng i Euler.

Chng trnh lit k tt c ng i Euler c th hin nh sau:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define MAX 50
#define

TRUE

#define FALSE

1
0

int m, b[MAX], u, i, OK;


void Init(int A[][MAX], int *n){
int i, j, s, d;FILE *fp;
fp = fopen("DDEULER.IN", "r");
fscanf(fp,"%d", n);

printf("\n So dinh do thi:%d",*n);


printf("\n Ma tran ke:");
u=1; d=0; m=0;
for(i=1; i<=*n;i++){
printf("\n");s=0;
for(j=1; j<=*n;j++){
fscanf(fp,"%d", &A[i][j]);
printf("%3d", A[i][j]);
s+=A[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;
printf("\n Co duong di Euler:");
for(i=0; i<=m; i++)
printf("%3d", b[i]);
}
void DDEULER(int *b, int A[][MAX], int n, int i){
int j, k;
for(j=1; j<=n;j++){
if (A[b[i-1]][j]==1){
A[b[i-1]][j]=0; A[j][b[i-1]]=0;
b[i]=j;
if(i==m)Result();
else DDEULER(b, A, n, i+1);
A[b[i-1]][j]=1; A[j][b[i-1]]=1;
}
}
}
void main(void){

int A[MAX][MAX], n;
clrscr(); Init(A, &n);
b[0]=u;i=1;
if(OK) DDEULER(b, A, n, i);
else printf("\n Khong co duong di Euler");
getch();
}
6.6. ng i v chu trnh Hamilton
Vi th Euler, chng ta quan tm ti vic duyt cc cnh ca th mi cnh ng mt ln, th trong mc ny,
chng ta xt n mt bi ton tng t nhng ch khc nhau l ta ch quan tm ti cc nh ca th, mi nh
ng mt ln. S thay i ny tng nh khng ng k, nhng thc t c nhiu s khc bit trong khi gii quyt
bi ton.
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 cha ng i
Hamilton c gi l th na Hamilton.
Nh vy, mt th Hamilton bao gi cng l th na Hamilton nhng iu ngc li khng lun lun ng. V
d sau s minh ha cho nhn xt ny.
V d. th thi hamilton G3, na Hamilton G2 v G1.
a

G1

G2

G3

Hnh 6.8. th thi hamilton G3, na Hamilton G2 v G1.


Cho n nay, vic tm ra mt tiu chun nhn bit th Hamilton vn cn m, mc d y l vn trung
tm ca l thuyt th. Hn th na, cho n nay cng vn cha c thut ton hiu qu kim tra mt th c
phi l th Hamilton hay khng.
lit k tt c cc chu trnh Hamilton ca th, chng ta c th s dng thut ton sau:
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) and (y == v0) then
Ghinhan(X[1], X[2], . . ., X[n], v0);
else {
X[k]=y; chuaxet[y] = false;
Hamilton(k+1);
chuaxet[y] = true;

}
}
}
Chng trnh chnh c th hin nh sau:
{
for (vV ) chuaxet[v] = true; /*thit lp trng thi cc nh*/
X[1] = v0; (*v0 l mt nh no ca th*)
chuaxet[v0] = false;
Hamilton(2);
}
Cy tm kim chu trnh Hamilton th hin thut ton trn c m t nh trong hnh 6.9.
2
1

3
G=(V,E)4
1

5 3

5 4

3
2

5
3 1 5

3
2
1

2
1

Hnh 6.9. Cy tm kim chu trnh Hamilton.


Chng trnh lit k cc chu trnh Hamilton c th hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define MAX 50
#define TRUE

#define FALSE

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){
printf("\n Khong co file input");
getch(); return;

}
fscanf(fp,"%d",&n);
printf("\n So dinh do thi:%d", n);
printf("\n Ma tran ke:");
for(i=1; i<=n; i++){
printf("\n");
for(j=1; j<=n; j++){
fscanf(fp, "%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
fclose(fp);
for (i=1; i<=n;i++)
C[i]=0;
}
void Result(void){
int i;
printf("\n ");
for(i=n; i>=0; i--)
printf("%3d", B[i]);
d++;
}
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)
printf("\n Khong co chu trinh Hamilton");
getch();
}
Chng trnh duyt tt c ng i Hamilton nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define MAX 50
#define TRUE

#define FALSE

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){
printf("\n Khong co file input");
getch(); return;
}
fscanf(fp,"%d",&n);
printf("\n So dinh do thi:%d", n);
printf("\n Ma tran ke:");
for(i=1; i<=n; i++){
printf("\n");
for(j=1; j<=n; j++){
fscanf(fp, "%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
fclose(fp);
for (i=1; i<=n;i++)
C[i]=0;
}
void Result(void){

int i;
printf("\n ");
for(i=n; i>0; i--)
printf("%3d", B[i]);
d++;
}
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)
printf("\n Khong co duong di Hamilton");
getch();
}
6.7. Nhng im cn ghi nh
Mt thut ton tm kim trn th l php ving thm cc nh ca n mi nh ng mt ln.
Php duyt theo chiu su s dng cu trc d liu stack.
Php duyt theo chiu rng s dng cu trc d liu hng i.
Xc nh cc thnh phn lin thng v ng i gia hai nh bt k ca th u c th s dng thut
ton DFS() hoc BFS().
Nm vng v phn bit r s khc bit gia chu trnh (ng i) Euler v chu trnh (ng i Hamilton).
Phng php hiu r bn cht nht ca thut ton l ci t v kim chng thut ton bng cch vit
chng trnh.
BI TP CHNG 6

Bi 1. Cho th G=<V, E> cho bi danh sch k. Hy vit th tc loi b cnh (u,v) thm cnh (x,y) vo th.
Bi 2. p dng thut ton tm kim theo chiu su tm tt c cc cu trn th v hng. (Cu l cnh m loi
b n lm tng s thnh phn lin thng ca th).
Bi 3. p dng thut ton tm kim theo chiu su kim tra xem th c hng G=<V, A> c chu trnh hay
khng.
Bi 4. Cho mt bng vung m x n , nm trn dng i, ct j gi l (i, j): i=1,2,..,m; j=1, 2, ..,n. Trong mi
(i, j) ta vit mt s a[i,j] {0, 1}. Hy vit chng trnh m s min con ton 0 ca bng. V d s min con ton 0
ca bng kch thc 5x5 c ch ra trong hnh di y:
1

You might also like