Professional Documents
Culture Documents
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
Detroit
Chicago
New York
Denver
Los Angeles
Washington
Detroit
Chicago
New York
Denver
Los Angeles
Washington
San Francisco
Detroit
Chicago
New York
Denver
Los Angeles
Washington
Detroit
Chicago
New York
Denver
Los Angeles
Washington
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
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:
vO
vU
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
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.
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.
6
3
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)
5
3
6
6
4
8
6
7
9
3
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.
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
Hnh 5.11
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.
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
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)
DFS(2)
1, 2
DFS(4)
1, 2, 4
DFS(3)
1,2,4, 3
DFS(6)
1,2,4,3, 6
DFS(7)
1,2,4,3, 6,7
DFS(8)
1,2,4,3, 6,7,8
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:
#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
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
8, 9
5, 10
9, 10
10, 5
1,2,3,11,4,6,12,13,7, 8, 9,10, 5
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])
}
}
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
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
#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
100
#define TRUE
#define FALSE
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
c
c
H1
d
H2
c
H3
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;*/
}
b
4
5
9
10
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
#include <dos.h>
#define MAX 50
#define
TRUE
#define FALSE
1
0
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
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:
TRUE
#define FALSE
1
0
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
}
}
}
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
#define FALSE
}
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 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