Professional Documents
Culture Documents
Bai Giang Ki Thuat Lap Trinh
Bai Giang Ki Thuat Lap Trinh
Bai Giang Ki Thuat Lap Trinh
BI GING
K THUT LP TRNH
Bin son :
Gii thiu mn hc
GII THIU MN HC
II. MC CH
Mn hc cung cp cho sinh vin k nng lp trnh trn cc cu trc d liu quan trng
nh: stack, queue mlink, tree & graph cng vi phng php phn tch, thit k, nh gi
thut ton.
Sau khi hc xong mn hc ny, sinh vin c kh nng vit c chng trnh gii
quyt nhng bi ton trong thc t.
Li ni u
- Sinh vin phi c kin thc c bn v ton hc cao cp.
- Thnh tho t nht mt ngn ng lp trnh. c bit trong cun sch ny s dng
ngn ng lp trnh C m t thut ton, v vy sinh vin phi nm c ngn ng lp trnh C.
2. Cc ti liu cn c:
Sch hng dn hc tp K thut lp trnh. Ths. Nguyn Duy Phng, Hc vin
Cng ngh Bu chnh Vin thng, 2006.
Nu cn sinh vin nn tham kho thm:
- Gio trnh K thut lp trnh. Ts. L Hu Lp, Ths. Nguyn Duy Phng, Hc
vin Cng ngh Bu chnh Vin thng, 2002.
- Bi ging in t mn hc: K thut lp trnh ca Hc vin Cng ngh Bu
chnh Vin thng.
3. t ra mc tiu, thi hn cho bn thn
t ra cc mc tiu tm thi v thi hn cho bn thn v c gng thc hin chng
Xy dng mc tiu trong chng trnh nghin cu.
4 Nghin cu v nm nhng kin thc ct li
Sinh vin nn c qua sch hng dn hc tp trc khi nghin cu bi ging mn
hc v cc ti liu tham kho khc.
5. Tham gia y cc bui hng dn hc tp
Thng qua cc bui hng dn hc tp, ging vin s gip sinh vin nm c ni
dung tng th ca mn hc v gii p thc mc, ng thi sinh vin cng c th trao i,
tho lun vi nhng sinh vin khc v ni dung bi hc.
6. Ch ng lin h vi bn hc v ging vin
Cch n gin nht l tham d cc din dn hc tp trn mng Internet, qua c th
trao i trc tip cc vn vng mc vi ging vin hoc cc bn hc khc ang online.
7. T ghi chp li nhng chnh
Vic ghi chp li nhng chnh l mt hot ng ti hin kin thc, kinh nghim
cho thy n gip ch rt nhiu cho vic hnh thnh thi quen t hc v t duy nghin cu.
8. Hc i i vi hnh
Hc l thuyt n u thc hnh lm bi tp v thc hnh ngay n hiu v nm
chc l thuyt. Sinh vin cn ci t trn my tnh cc thut ton trong bi hc bng cc ngn
ng lp trnh t c th hiu v nm chc hn t tng v ni dung ca thut ton.
H Ni, ngy 20 thng 02 nm 2006
Ths. Nguyn Duy Phng
cu lnh
A; GOTO.
Else B;
B;
While (E) A;
do
A
E
S
A;
while (E);
Cu trc lp FOR
For (E1; E2;E3)
E1
A;
E3
E2
Trong v d trn, while (E1) A; l cu trc con nm trong thn ca cu trc cha l if
(E) ; cn do B while(E2); l cu trc con trong thn ca else. Do vy, cu lnh while(E1);
do . . . while(E2) c cng cp vi nhau nn n phi nm trn cng mt ct, tng t nh
vy vi A, B v if vi else.
1.2.3. Cu trc d liu
Cc ngn ng lp trnh cu trc ni chung u ging nhau v cu trc lnh v cu
trc d liu. im khc nhau duy nht gia cc ngn ng lp trnh cu trc l phng php
t tn, cch khai bo, c php cu lnh v tp cc php ton c php thc hin trn cc
cu trc d liu c th. Nm bt c nguyn tc ny, chng ta s d dng chuyn i cch
th hin chng trnh t ngn ng lp trnh ny sang ngn ng lp trnh khc mt cnh
nhanh chng m khng tn qu nhiu thi gian cho vic hc tp ngn ng lp trnh.
Thng thng, cc cu trc d liu c phn thnh hai loi: cu trc d liu c kiu
c bn (Base type) v cu trc d liu c kiu do ngi dng nh ngha (User type) hay
cn gi l kiu d liu c cu trc. Kiu d liu c bn bao gm: Kiu k t (char), kiu s
nguyn c du (signed int), kiu s nguyn khng du (unsigned int), kiu s nguyn di c
du (signed long), kiu s nguyn di khng du (unsigned long ), kiu s thc (float) v
kiu s thc c chnh xc gp i (double).
Kiu d liu do ngi dng nh ngha bao gm kiu xu k t (string), kiu mng
(array), kiu tp hp (union), kiu cu trc (struct), kiu file, kiu con tr (pointer) v cc
kiu d liu c nh ngha mi hon ton nh kiu danh sch mc ni (link list), kiu cy
(tree) . . .
Kch c ca kiu c bn ng ngha vi min xc nh ca kiu vi biu din nh
phn ca n, v ph thuc vo tng h thng my tnh c th. xc nh kch c ca kiu
nn dng ton t sizeof( type). Chng trnh sau s lit k kch c ca cc kiu c bn.
7
--a
a*=n
if ( !a )
// ph nh a khc 0
if (a==b)
// nu a ng bng b
: Php hi cc bt.
<<
>>
: Php ly phn b.
TN TON T
( ), [] , ->
L -> R
- , ++, -- , ! , ~ , sizeof()
R -> L
* , /, %
L -> R
10
L -> R
>>, <<
L -> R
L -> R
== !=
L -> R
&
L -> R
L -> R
L -> R
&&
L -> R
||
L -> R
?:
R -> L
=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=
R -> L
1.3.2. Tp cc lnh vo ra c bn
Nhp d liu t bn phm: scanf(format_string, . . ., ¶meter . . .);
Nhp d liu t tp: fscanf( file_pointer,format_string, . . ., ¶meter, . . .);
Nhn mt k t t bn phm: getch(); getchar();
Nhn mt k t t file: fgetc(file_pointer, character_name);
Nhp mt string t bn phm: gets(string_name);
Nhn mt string t file text : fgets(string_name, number_character, file_pointer);
Xut d liu ra mn hnh: printf(format_string . . ., parameter . . .);
Xut d liu ra file : fprintf(file_pointer, format_string . . ., parameter. . .);
Xut mt k t ra mn hnh: putch(character_name);
Xut mt k t ra file: fputc(file_pointer, character_name);
Xut mt string ra mn hnh: puts(const_string_name);
Xut mt string ra file: fputs(file_pointer, const_string_name);
1.3.3. Thao tc trn cc kiu d liu c cu trc
Tp thao tc trn string:
char *strchr(const char *s, int c) : tm k t c u tin xut hin trong xu s;
char *stpcpy(char *dest, const char *src) : copy xu scr vo dest;
11
12
14
15
16
17
Trong v d trn, chng ta s dng nh ngha MAX =100 gii quyt bi ton.
MAX c hiu l bc ca a thc ln nht m chng ta cn x l. Nh vy, bn thn vic
nh ngha MAX hn ch ti phm vi bi ton, hn ch cng c th xut pht t
thit k. Do vy, nu ngi s dng nhp n>MAX th chng trnh s gp li. Nu chng ta
khc phc bng cch nh ngha BAC ln th trong trng hp x l cc a thc c bc n
nh s gy nn hin tng lng ph b nh, v trong nhiu trng hp khng b nh
nh ngha a thc. Gii php khc phc cc li loi ny l chng ta s dng con tr thay
cho cc hng, k thut ny s c tho lun k trong Chng 2.
Mt trong nhng nguyn l quan trng ca lp trnh cu trc l phng php phn
tch t trn xung (Top - Down) vi quan im thy cy khng bng thy rng, phi
ng cao hn quan st tng th khu rng ch khng th ng trong rng quan st chnh
n.
Qu trnh phn r bi ton c thc hin theo tng mc khc nhau. Mc thp nht
c gi l mc tng quan (level 0), mc tng quan cho php ta nhn tng th h thng
thng qua cc chc nng ca n, ni cch khc mc 0 s tr li thay cho cu hi H thng
c th thc hin c nhng g ?. Mc tip theo l mc cc chc nng chnh. mc ny,
nhng chc nng c th c m t. Mt h thng c th c phn tch thnh nhiu mc
khc nhau, mc thp c php s dng cc dch v ca mc cao. Qu trnh phn tch tip
18
a : integer;
Output
Format
Binary(a);
Actions
{
Q = n; k=0;
While ( Q 0 ) {
ak = q mod b;
q = q div b;
k = k +1;
}
< Khai trin c s b ca a l (ak-1, ak-2, . ., a1, a0) >;
19
20
21
rng, sau khi phn r bi ton mc 1, chng ta ch cn xy dng hai php ton
cng v php tnh nhn cc s nh phn ca a, b. V hiu hai s a v b chnh l tng s ca
(a,-b). Tng t nh vy, tch hai s a v b c biu din bng tng ca mt s ln php
nhn mt bt nh phn ca vi a. Php chia v ly phn d hai s a v b chnh l php tr
nhiu ln s a. Php tm USCLN cng tng t nh vy.
i vi cc h thng ln, qu trnh cn c m t tip tc cho ti khi nhn c
mc n v chng trnh. Trong v d n gin ny, mc n v chng trnh xut hin
ngay ti mc 1 nn chng ta khng cn phn r tip na m dng li ci t h thng.
22
23
24
25
26
BI TP CHNG 1
27
28
Duyt ton b l phng php ph dng nht trong khi gii quyt mt bi ton trn
my tnh. Cc k thut duyt cng rt phong ph a dng nu nh ta chng ta li dng c
nhng mo mc khng mang tnh tng qut ho nhng hn ch c khng gian tm kim
li gii bi ton. qui c s dng nhiu trong cc k thut duyt. S dng qui
thng cho ta mt li gii tng i ngn gn, d hiu nhng n cha trong n nhiu b n
kh lng. Tuy nhin, n vn c coi l mt mu hnh vt cn tt c cc kh nng ca
bi ton. Cc k thut qui c cp y bao gm:
9 Cc nh ngha bng qui, cc cu trc d liu nh ngha bng qui & gii
thut qui.
9 Thut ton sinh k tip gii quyt bi ton duyt.
9 Thut ton quay lui giiquyt bi ton duyt.
9 Thut ton nhnh cn giiquyt bi ton duyt.
Bn c c th tm thy nhiu hn nhng ng dng v ci t c th phng php
duyt trong ti liu [1].
tnh ton c S(n) trc tin ta phi tnh ton trc S(n-1) sau tnh
S(n) = S(n-1) +n.
tnh ton c S(n-1), ta phi tnh ton trc S(n-2) sau tnh S(n-1) =
S(n-2) + n-1.
......................................................
tnh ton c S(2), ta phi tnh ton trc S(1) sau tnh S(2) = S(1) + 2.
S(1) = 1
S(2) = S(1) + 2
S(3) = S(2) + 3
............
S(n) = S(n - 1) + n
*, trong l xu rng
wx * nu w * v x
30
Thut ton 2: Thut ton qui tnh c s chung ln nht ca hai s nguyn dng
a v b.
int USCLN( int a, int b){
if (a == 0) return(b);
return(USCLN( b % a, a));
}
31
p(b)
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
10
1011
11
1100
12
1101
13
1110
14
1111
15
32
#define FALSE
int
Stop, count;
33
34
j;
Try(i+1);
}
}
}
C th m t qu trnh tm kim li gii theo thut ton quay lui bng cy tm kim
li gii sau:
Gc
Kh nng chn x1
Kh nng chn x2
vi x1 chn
Kh nng chn x3 vi
x1, x2 chn
35
(2*N-1)
#define
SG
(N-1)
#define
TRUE 1
#define
FALSE 0
void hoanghau(int);
void inloigiai(int
int
loigiai[]);FILE *fp;
36
min{ f ( x) : x D}
Trong , D l tp hu hn phn t. Ta gi thit D c m t nh sau:
D = { x =( x1, x2, . . ., xn) A1 A2 . . . An ; x tho mn tnh cht P }, vi A1 A2
. . . An l cc tp hu hn, P l tnh cht cho trn tch cc A1 A2 . . . An .
Vi gi thit v tp D nh trn, chng ta c th s dng thut ton quay lui lit k
cc phng n ca bi ton. Trong qu trnh lit k theo thut ton quay lui, ta s xy dng
37
(*)
38
f )) Try (k+1);
f = +;
(* Nu bit mt phng n x no th c th t
f = f ( x) *)
Try(1);
if(
f )) Try(k+1);
bi
if (k == n) < cp nht k lc >;
else Try(k+1);
T1 T (u 2 ) ... T (u k 1 ) T (u k )
V vy, chi ph phi tr theo hnh trnh b phn ny s l tng cc chi ph theo tng
node ca hnh trnh b phn.
39
C=
3 14 18 15
4 22 20
17
6
9
2
0 16 4
7 0 12
9 15 11
g l cn di
T1 T2 T3 T5 T4 T1
v chi ph nh nht l 22
40
f = +
(2) =3; g=15
(2,3,4)
g=29
=23;
(2,5)=23; g=32
=11;
(2,3,5)
g=17
Cc nhnh ny b loi v c cn
(2,3,4,5)
g=44
=41;
=16;
(2,3,5,4)
g=19
f = 53
di g >
f = 22
f = 22
Chng trnh gii bi ton theo thut ton nhnh cn c th hin nh sau:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#define MAX 20
int n, P[MAX], B[MAX], C[20][20], count=0;
int A[MAX], XOPT[MAX];
int can, cmin, fopt;
void Read_Data(void){
int i, j;FILE *fp;
fp = fopen("dulich.in","r");
fscanf(fp,"%d", &n);
printf("\n So thanh pho: %d", n);
printf("\n Ma tran chi phi:");
41
42
43
44
BI TP CHNG 2
tapcon.out
1
2
2
3
3
Bi 2. Tm tp con di nht c th t tng dn, gim dn. Cho dy s a1, a2, . . ., an.
Hy tm dy con di nht c sp xp theo th t tng hoc gim dn. D liu vo
cho bi file tapcon.in, dng u tin ghi li s t nhin n (n100), dng k tip ghi li
n s, mi s c phn bit vi nhau bi mt hoc vi k t rng. Kt qu ghi li
trong file tapcon.out. V d sau s minh ha cho file tapcon.in v tapcon.out.
tapcon.in
tapcon.out
7 1 3 8 9 6 12
1 3 8 9 12
50
10
15
20
25
tapcon.out
20
30
45
30
35
35
10
15
25
20
25
15
30
10
35
10
15
20
bai14.out
0
tapcon.out
1
5
46
50
10
15
20
25
30
35
tapcon.out
5
10
35
15
35
20
25
10 15
25
2
47
3 4
2 5
4 1
chiaso.out
1
48
10
caitui.out
15
49
caitui.out
14
1
Bi 15. Bi ton ngi du lch. Mt ngi du lch mun i tham quan ti n thnh ph khc
nhau. Xut pht ti mt thnh ph no , ngi du lch mun i qua tt c cc thnh
ph cn li mi thnh ph ng mt ln ri quay tr li thnh ph ban u. Bit Cij l
chi ph i li t thnh ph th i n thnh ph th j. Hy tm hnh trnh c chi ph thp
nht cho ngi du lch. D liu vo cho bi file dulich.in, dng u tin ghi li s t
nhin n, n dng k tip ghi li ma trn chi ph Cij. Kt qu ghi li trong file dulich.out,
dng u tin ghi li chi ph ti u, dng k tip ghi li hnh trnh ti u. V d sau s
minh ha cho file input & output ca bi ton.
dulich.in
5
00
48
43
54
31
20
00
30
63
22
29
64
00
04
17
06
19
02
00
08
01
28
07
18
00
dulich.out
81
1
50
(hnh b)
push(S,B)
(hnh c)
51
(hnh d)
push(S,D)
(hnh e)
pop(S)
(hnh f)
pop(S)
(hnh g)
B
A
A
(a)
(b)
C
B
A
D
C
B
A
(d)
(e)
(c)
C
B
A
B
A
(f)
(g)
T
S1
S2
S3
...
ST
BOOTTOM
...
TRUE 1
#define
FALSE 0
#define
MAX
typedef struct
100
{
int
top;
int
nodes[MAX];
} stack;
52
Empty(stack *ps) {
if (ps ->top == -1)
return(TRUE);
return(FALSE);
53
V d :
MAX
100
#define
TRUE 1
#define
FALSE 0
typedef
struct{
int top;
char node[MAX];
} stack;
/* nguyen mau cua ham*/
int
Empty(stack *);
54
struct{
int mahang;
55
truy nhp vo hng i, chng ta s dng hai bin con tr front ch li trc v
rear ch li sau. Khi li trc trng vi li sau (q.rear = q.rear) th queue trng thi rng
(hnh a), thm d liu vo hng i cc phn t A, B, C c thc hin thng qua thao
tc insert(q,A), insert(q,B), insert(q,C) c m t hnh b, thao tc loi b phn t khi
hng i Remove(q) c m t hnh c, nhng thao tc tip theo c m t ti hnh d, e.
q.front=0
B
q.rear=2 q.front=1
C
q.rear=3
D
q.rear=3
D
Hnh c. remove(q).
B
q.front=1
Hnh d. insert(q,D).
B
q.front=2
Hnh e. remove(q).
C
Hnh 3.3. Cc thao tc trn Hng i (Queue)
56
struct{
int mahang;
char ten[20];
} hang;
typedef struct {
int front, rear;
hang node[MAX];
} queue;
Thao tc Initialize: thit lp trng thi ban u ca hng i. trng thi ny, font
v rear c cng mt gi tr MAX-1.
void Initialize ( queue *pq){
pq->front = pq->rear = MAX -1;
}
Thao tc Empty: kim tra hng i c trng thi rng hay khng. Hng i rng
khi front == rear.
int Empty(queue *pq){
if (pq->front==pq->rear)
return(TRUE);
return(FALSE);
}
57
Remove(queue *pq){
if (Empty(pq)){
printf("\n Queue Empty");
delay(2000);
}
else {
if (pq->front ==MAX-1)
pq->front=0;
else
pq->front++;
}
return(pq->node[pq->front]);
58
MAX
50
#define
TRUE 1
#define
FALSE 0
typedef
struct{
int mahang;
char ten[20];
} hang;
typedef struct {
int front, rear;
hang node[MAX];
} queue;
/* nguyen mau cua ham*/
void
int
Empty(queue *);
Traver(queue *);
/* Mo ta ham */
void Initialize ( queue *pq){
pq->front = pq->rear = MAX -1;
}
int Empty(queue *pq){
if (pq->front==pq->rear)
59
Remove(queue *pq){
if (Empty(pq)){
printf("\n Queue Empty");
delay(2000);
}
else {
if (pq->front ==MAX-1)
pq->front=0;
else
pq->front++;
}
return(pq->node[pq->front]);
}
void Traver( queue *pq){
int i;
if(Empty(pq)){
printf("\n Queue Empty");
return;
}
if (pq->front ==MAX-1)
i=0;
else
i = pq->front+1;
while (i!=pq->rear){
printf("\n %11d % 15s", pq->node[i].mahang, pq->node[i].ten);
if(i==MAX-1)
60
61
Trong trng hp ny, bin nguyn phantu ca tng nh cha d liu cn bin con
tr tiep cha a ch ca nh tip theo. S biu din danh sch mc ni n c biu
din nh hnh di y:
Phn_t
Phn_t
Phn_t
62
....
63
next
infor
infor
next
infor
next
next
Node cn chn vo u danh sch mc ni.
infor
next
infor
next
infor
infor
next
next
NULL
65
next
infor
next
infor
next
q
infor
next
NULL
66
67
Null
Null
68
69
70
71
9 Cc phng php nh ngha stack, khi no dng stack & vai tr ca stack i vi
cc gii thut qui.
9 Phng php nh ngha hng i, cc thao tc trn hng i v ng dng ca
hng i.
9 Bn cht ng l tnh cht c bn nht ca danh sch lin kt n v lin kt kp.
9 S khc bit c bn ca danh sch lin kt n v danh sch lin kt kp l cc
con tr left v right.
9 Nhng ng dng ln thng c ci t trn cc cu trc d liu ng.
9 Ch gii phng b nh cho con tr trong khi lp trnh.
72
BI TP CHNG 3
Bi 2. Vit chng trnh qun l im thi ca sinh vin bng single (double) link list bao
gm nhng thao tc sau:
- Nhp d liu;
- Hin th d liu theo lp, xp loi . . .;
- Sp xp d liu;
- Tm kim d liu;
- In n kt qu.
Trong , thng tin v mi sinh vin c nh ngha thng qua cu trc sau:
typedef struct {
int
char
malop[12]; //m lp
char
float
diemki; // im tng kt k 1
float
diemkii;// im tng kt k 2
float
diemtk; // im tng kt c nm
char
xeploai[12]; // xp loi
} sinhvien;
Bi 3. Biu din biu thc theo c php Ba Lan. Biu thc nguyn l mt dy c thnh
lp t cc bin kiu nguyn ni vi nhau bng cc php ton hai ngi ( cng: + , tr : , nhn : *) v cc du m ngoc n (, ng ngoc n ). Nguyn tc t tn bin
v th t thc hin cc php ton c thc hin nh sau:
-
Qui tc thc hin php ton: Biu thc trong ngoc n c tnh
trc, php ton nhn * c u tin cao hn so vi hai php ton
cng v tr. Hai php ton cng + v tr c cng u tin. V d :
a * b + c phi c hiu l: (a * b) + c.
Dng vit khng ngoc Ba Lan cho biu thc nguyn c nh ngha nh sau:
-
Cho file d liu balan.in c t chc thnh tng dng, mi dng khng di qu 80
k t l biu din ca biu thc nguyn A. Hy dch cc biu thc nguyn A thnh dng
vit Ba Lan ca A ghi vo file balan.out theo tng dng. V d: vi file balan.in di y s
cho ta kt qu nh sau:
balan.in
balan.out
a+b
a b+
a-b
a b-
a*b
a b*
(a - b) +c
a b- c+
(a + b) * c
a b+ c*
(a + (b-c))
a b c-+
( a + b*(c-d))
a b c d-*+
( (a + b) *c- ( d + e) * f)
a b+c* d e+f*-
Bi 4. Tnh ton gi tr biu thc Ba Lan. Cho file d liu balan.in gm 2 * n dng trong
, dng c s th t l (1, 3, 5, . . ) ghi li mt xu l biu din Ba Lan ca biu thc
nguyn A, dng c s th t chn (2,4,6, . .) ghi li gi tr ca cc bin xut hin trong
A. Hy tnh gi tr ca biu thc A, ghi li gi tr ca A vo file balan.out tng dng
theo th t: Dng c th t l ghi li biu thc Ba Lan ca A sau khi thay th cc
gi tr tng ng ca bin trong A, dng c th t chn ghi li gi tr ca biu thc A.
V d vi file balan.in di y s cho ta kt qu nh sau:
balan.in
balan.out
a b+
3 5+
74
a b-
7 3-
73
a b*
43*
43
12
c a b-+
3 4 5-+
345
10
2 Editor_Program
20
3 System_Call
0.5
4 System_Interative
5 System_Action 3
6 Writing_Data
7 Reading_Data 2
10
20
75
63.5
Bi 6. Thut ton RR (Round Robin): Thut ton SJF p ng c ti a cc qu trnh
hot ng trong h, tuy nhin s c nhiu qu trnh c chi ph thi gian ln phi i
nhiu qu trnh c chi ph thi gian nh thc hin. Vi thut ton SJF , tnh cng bng
ca h b vi phm. khc phc iu trn, thut ton Round Robin thc hin chn
mt lng t thi gian thch hp, sau p ng cho mi qu trnh theo tng vng
vi lng t thi gian chn. u im ca RR l tnh cng bng ca h c m
bo, s cc qu trnh c CPU p ng trn mt n v thi gian chp nhn c.
Nhc im ln nht ca thut ton l vic la chn lng t thi gian p ng cho
mi qu trnh sao cho ti u khng phi l n gin. Hy vit chng trnh m phng
thut ton lp lch RR.
76
4.1
4.1.1
4.1.2
4.2
4.3
4.3.1
4.4
4.3.2
Hnh 4.1. V d v mt cy th mc
77
4.4.1
4.4.2
Hnh 4.2. m t cp ca cy
Node c cp bng 0 c gi l l (leaf) hay node tn cng (terminal node). V d:
cc node E, F, C, G, I, J, K c gi l l. Node khng l l c gi l node trung gian hay
node nhnh (branch node). V d node B, D, H l cc node nhnh.
Cp cao nht ca node trn cy gi l cp ca cy, trong trng hp cy trong hnh
4.2 cp ca cy l 3.
Gc ca cy c s mc l 1. Nu node cha c s mc l i th node con c s mc l
i+1. V d gc A c s mc l 1, D c s mc l 2, G c s mc l 3, J c s mc l 4.
Chiu cao (height) hay chiu su (depth) ca mt cy l s mc ln nht ca node
trn cy . Cy 4.2 c chiu cao l 4.
ng i t node n1 n nk l dy cc node n1, n2, . ., nk sao cho ni l node cha ca
node ni+1 (1<=i<k), di ca ng i (path length) c tnh bng s cc node trn
ng i tr i 1 v n phi tnh t node bt u v node kt thc. V d: trong cy 4.2
ng i t node A ti node G l 2, ng i t node A n node K l 3.
Mt cy c gi l c th t nu chng ta xt n th t cc cy con trong cy
(ordered tree), ngc li l cy khng c th t (unordered tree). Thng thng cc cy con
c tnh theo th t t tri sang phi.
4.2. CY NH PHN
Cy nh phn l mt dng quan trng ca cu trc cy c c im l mi node trn
cy ch c ti a l hai node con. Cy con bn tri ca cy nh phn c gi l left subtree,
cy con bn phi ca cy c gi l right subtree. i vi cy nh phn, bao gi cng
c phn bit cy con bn tri v cy con bn phi. Nh vy, cy nh phn l mt cy c
th t. V d trong hnh 4.3 u l cc cy nh phn:
78
E
Hnh 4.3. Cy nh phn
A
B
B
B
C
E
E
E
Hnh 4.4a
Hnh 4.4b
Hnh 4.4c
79
E
Hnh
4.4d
C
E
G
D
C
E
I
Hnh 4.4 e
Hnh 4.4f
S node nhnh cy con bn tri bng s node nhnh cy con bn phi bng
(Nl = Nr ) (hnh 4.5a).
S node nhnh cy con bn tri bng s node nhnh cy con bn phi cng 1
(Nl = Nr+1) (hnh 4.5b)
Hnh 4.5a
C
D
Hnh 4.5b
Hnh 4.5c
80
20
12
8
30
25
15
10
22
37
10
19
29
40
28
39
30
25
22
V[0]
V[1] V[2]
30
25
37
V[3]
22
V[4]
V[5] V[6]
28
35
40
37
28
35
40
81
37
25
22
V[0]
V[1]
V[2]
V[3]
30
25
37
22
35
35
Infor
Right
30
right
30
25
22
37
35
Left
25
NULL
22
right
NULL
Left
NULL
82
37
35
NULL
NULL
MAX
100
#define
TRUE 1
#define
FALSE 0
struct
node {
int
infor;
int
left;
int
right;
typedef struct
node
};
node[MAX];
node {
int
infor;
struct
node
*left;
struct
node
*right;
struct
node *NODEPTR
}
typedef
Getnode(void) {
NODEPTR
p;
Khi ng cy nh phn
void Initialize(NODEPTR *ptree){
*ptree=NULL;
}
83
Empty(NODEPTR
*ptree){
if (*ptree==NULL)
return(TRUE);
return(FALSE);
}
NODEPTR
Makenode(int
NODEPTR
x){
p;
Nu node p cha c node con bn tri, th vic to node con bn tri chnh l
thao tc make node c xy dng nh trn;
void Setleft(NODEPTR
p, int x ){
if (p==NULL){
// nu node p khng c thc th khng th thc hin c
printf(\n Node p khng c thc);
delay(2000); return;
}
// nu node p c thc v tn ti l con bn tri th cng khng thc hin c
else if ( p ->left !=NULL){
printf(\n Node p c node con bn tri);
delay(2000); return;
}
// nu node c thc v cha c node tri
84
void Setright(NODEPTR
p, int x ){
Delleft(NODEPTR p) {
NODEPTR q; int x;
if ( p==NULL)
printf(\n Node p khng c thc);delay(2000);
exit(0);
}
q = p ->left; // q l node cn xo;
x = q->infor; //x l ni dung cn xo
if (q ==NULL){ // kim tra p c l bn tri hay khng
printf(\n Node p khng c l bn tri);
delay(2000); exit(0);
}
if (q->left!=NULL || q->right!=NULL) {
// kim tra q c phi l node l hay khng
printf(\n q khng l node l);
delay(2000); exit(0);
}
p ->left =NULL; // to lin kt mi cho p
Freenode(q); // gii phng q
return(x);
}
86
Delright(NODEPTR p) {
NODEPTR q; int x;
if ( p==NULL)
printf(\n Node p khng c thc);delay(2000);
exit(0);
}
q = p ->right; // q l node cn xo;
x = q->infor; //x l ni dung cn xo
if (q ==NULL){ // kim tra p c l bn phi hay khng
printf(\n Node p khng c l bn phi);
delay(2000); exit(0);
}
if (q->left!=NULL || q->right!=NULL) {
// kim tra q c phi l node l hay khng
printf(\n q khng l node l);
delay(2000); exit(0);
}
p ->right =NULL; // to lin kt cho p
Freenode(q); // gii phng q
return(x);
p;
87
A
B
D
C
E
Nu cy rng th khng lm g;
Nu cy khng rng th :
9 Thm node gc ca cy;
9 Duyt cy con bn tri theo th t trc;
9 Duyt cy con bn phi theo th t trc;
88
Nu cy rng th khng lm g;
Nu cy khng rng th :
9 Duyt cy con bn tri theo th t gia;
9 Thm node gc ca cy;
9 Duyt cy con bn phi theo th t gia;
Nu cy rng th khng lm g;
Nu cy khng rng th :
9 Duyt cy con bn tri theo th t sau;
9 Duyt cy con bn phi theo th t sau;
9 Thm node gc ca cy;
V d: cy trong hnh 4.11 th php duyt Postorder cho ta kt qu duyt theo th t
cc node l :D -> E -> B -> F -> G-> C -> A .
Vi cch duyt theo th t gia, chng ta c th ci t cho cy c nh ngha
trong mc 4.4 bng mt th tc qui nh sau:
void
89
90
91
TRUE 1
#define
FALSE 0
#define
MAX
struct node
100
{
int infor;
struct node *left;
struct node *right;
};
typedef struct node *NODEPTR;
NODEPTR Getnode(void){
NODEPTR p;
p=(NODEPTR)malloc(sizeof(struct node));
return(p);
}
void Freenode(NODEPTR p){
free(p);
}
void Initialize(NODEPTR *ptree){
*ptree=NULL;
}
NODEPTR Makenode(int x){
NODEPTR p;
p=Getnode();
p->infor=x;
92
93
94
95
96
97
Cc phng php duyt cy: duyt theo th t trc, duyt theo th t gia v
duyt theo th t sau.
Phn bit c nhng thao tc ging nhau v khc nhau cy nh phn tm kim
v cy nh phn thng thng.
98
BI TP CHNG 4
To lp cy nh phn;
m s node ca cy nh phn;
Xc nh chiu su ca cy nh phn;
Xc nh s node l ca cy nh phn;
Loi b c cy;
99
Xc nh s node l;
Tm node c di ln nht;
Thm node;
Loi b node;
Loi b c cy;
100
7
3
2
4
D liu vo cho bi file cay.in, dng u tin ghi li s t nhin n l s lng hng
trong tam gic, n hng tip theo ghi li tng hng mi phn t c phn bit vi nhau bi
mt hoc vi du trng. Kt qu ghi li trong file cay.out dng u tin ghi li tng s ln
nht tm c, dng k tip ghi li dy cc s c tng ln nht. V d vi hnh trn file
input & output nh sau:
cay.in
5
7
2
cay.out
30
7
2
6
cay.out
22
7
102
Chng 5: th (Graph)
CHNG 5: TH (GRAPH)
103
Chng 5: th (Graph)
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 5.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.
Detroit
Chicago
New York
Denver
Los Angeles
Washington
Hnh 5.2. Mng my tnh a knh thoi.
104
Chng 5: th (Graph)
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
Detroit
Chicago
New York
Denver
Los Angeles
Washington
Hnh 5.4. Mng my tnh c hng.
105
Chng 5: th (Graph)
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.
106
Chng 5: th (Graph)
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 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).
5.1.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).
Ta gi 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 3. Tm cc ng i, chu trnh trong th v hng nh trong hnh 5.7.
D dng nhn thy (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
Chng 5: th (Graph)
Xt n th 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.8 di y bng ma trn k.
2
1
0
2
1
3
1
4
0
5
0
6
0
3
4
Hnh 5.9. th c hng G
1
2
0
0
1
0
1
0
0
1
0
1
5 4
108
Chng 5: th (Graph)
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) = d(u,v) gi l trng s ca cnh e. th trong trng hp nh
vy gi l th trng s. Trong trng hp , ma trn k ca th c thay bi ma trn
trng s c= { c[i,j], i, j= 1, 2, . . ., n. c[i,j] = d(i,j) nu (i, j) E, c[i,j] = nu (i, j) E.
Trong , nhn cc gi tr: 0, , - tu theo tng tnh hung c th ca thut ton.
V d 3. Ma trn k ca th c trng s trong hnh 5.10.
2
6 2
6
6
4
8
1
7
9
3
Cuoi
2
3
3
4
5
5
6
6
Dau
1
1
2
2
3
5
Cuoi
2
3
4
5
4
1
th c hng
109
Dau
1
1
2
2
3
4
4
5
Cuoi
2
3
3
4
5
5
6
6
Trongso
3
7
6
6
3
8
5
9
Chng 5: th (Graph)
5.2.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.8, th c hng trong hnh
5.9 c biu din bng danh sch k nh sau:
List(i)
nh
List(i)
nh
110
Chng 5: th (Graph)
Thm_nh(v); chuaxet[v] = FALSE;
for u ke(v) {
if (chuaxet[u] )
DFS( v);
}
}
6
8
7
10
11
12
13
Hnh 5.11. th v hng G
Kt qu duyt:
5.3.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 l v1, v2, . . ., vk c np vo queue k tip.
Qu trnh c thc tng t vi cc nh trong hng i. Thut ton dng khi ta duyt
ht cc nh k vi nh trong hng i. Chng ta c th m t thut ton bng th tc BFS
nh di y.
111
Chng 5: th (Graph)
chuaxet- mng kim tra cc nh xt hay cha;
queue hng i lu tr cc nh s c duyt ca th;
void BFS(int u){
queue = ;
u <= queue; (*np u vo hng i*)
chuaxet[u] = false;
while (queue ){
queue<=p; (* ly p ra t stack*)
Thm_nh(p);
for v ke(p) {
if (chuaxet[v] ) {
v<= queue; (*np v vo hng i*)
chuaxet[v] = false;
}
}
}
V d. p dng thut ton tm kim theo chiu rng vi th trong hnh 5.11 ta nhn
c kt qu nh sau:
1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10, 5;
5.3.3. Kim tra tnh lin thng ca th
Mt th c th lin thng hoc c th khng lin thng. Nu th l lin thng (s
thnh phn lin thng l 1), chng ta ch cn gi ti th tc DFS() hoc BFS() mt ln. Nu
th l khng lin thng, khi s thnh phn lin thng ca th chnh bng s ln gi
ti th tc BFS() hoc DFS(). xc nh s cc thnh phn lin thng ca th, chng ta
s dng mt bin mi solt nghi nhn cc nh cng mt thnh phn lin thng trong
mng chuaxet:
- 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.
void BFS(int u){
112
Chng 5: th (Graph)
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*)
Thm_nh(p);
for v ke(p) {
if (chuaxet[v] ){
v<= queue; (*np v vo hng i*)
chuaxet[v] = solt;
}
}
}
}
100
#define TRUE
#define FALSE
113
Chng 5: th (Graph)
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++){
114
Chng 5: th (Graph)
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();
}
c
G1
d
G2
G3
115
Chng 5: th (Graph)
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:
Euler_Cycle(int u){
Stack=; CE=;
u=>Stack; { np u vo stack};
while (Stack) {
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
Chng 5: th (Graph)
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
F
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
2
f, a
2, 3, 4, 5, 6, 7, 8, 9, 10
3
f, a, c
3, 4, 5, 6, 7, 8, 9, 10
4
f,a,c,f
3, 4, 5, 6, 7, 9, 10
5
f, a, c
f
3, 4, 5, 6, 7, 9, 10
6
f, a, c, b
f
3, 4, 6, 7, 9, 10
7
f, a, c, b, d
f
3, 4, 7, 9, 10
8
f, a, c, b, d,c
f
3, 4, 7, 10
9
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
3
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
f,c,d,a,b,e,d,b,c,a
22
f,c,d,a,b,e,d,b,c,a,f
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.
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:
9 Nu i<m th tng i ln 1 n v (xt nh tip theo) v quay li bc 2.
9 Nu i=m th dy b chnh l mt ng i Euler.
117
Chng 5: th (Graph)
G1
G2
d
G3
118
Chng 5: th (Graph)
T1
T2
T3
119
Chng 5: th (Graph)
Bi ton 2. Cho G = <V, E> l th v hng lin thng c trng s. Hy tm cy
bao trm nh nht ca G.
5.6.2. Tm mt cy bao trm trn th
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 . Trong c hai trng hp, mi khi ta n c
nh v tc (chuaxet[v] = true) t nh u th cnh (u,v) c kt np vo cy bao trm. Hai
k thut ny c th hin trong hai th tc STREE_DFS(u) v STREE_BFS(v) nh sau:
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);
}
}
}
void STREE_BFS(int u) {
QUUE=;
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);
}
}
}
}
/* Main program */
for u V {
chuaxet[u] = true;
T = ;
STREE_BFS(root);
}
120
Chng 5: th (Graph)
5.6.3. Tm cy bao trm ngn nht
Bi ton tm cy bao trm nh nht l mt trong nhng bi ton ti u trn th c
ng dng trong nhiu lnh vc khc nhau ca thc t. Bi ton c pht biu nh sau:
Cho G=<V, E> l th v hng lin thng vi tp nh V = {1, 2, . . ., n } v tp
cnh E gm m cnh. Mi cnh e ca th c gn vi mt s khng m c(e) c gi l
di ca n. Gi s H = <V, T> l mt cy bao trm ca th G. Ta gi di c(H) ca
cy bao trm H l tng di cc cnh ca n: c( H ) = c(e) . Bi ton c t ra l,
eT
20
33
1
8
18
16
17
14
3
Chng 5: th (Graph)
b.
c.
Kruskal(void) {
T = ;
While( | T | < (n-1) and (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>;
122
Chng 5: th (Graph)
void Prim(void) {
(*bc khi to*)
Chn s l mt nh no ca th;
VH = { s }; T = ; d[s] = 0; near[s] = s;
For v V\VH {
D[v] = C[s, v]; near[v] = s;
}
(* Bc lp *)
Stop = False;
While (! stop) {
Tm u V\VH tho mn : d[u] = min { d[v] vi uV\VH};
VH = VH {u}; T = T {u, near[u] };
If (| VH | == n ) {
H = (VH, T) l cy khung nh nht ca th;
Stop := TRUE;
}
Else
For (v V\VH ) {
If (d[v] > C[u, v]) {
D[v] = C[u, v];
Near[v] = u;
}
}
}
p
i =1
A[vi 1 , vi ]
c gi l di ca ng i.
Bi ton tm ng i ngn nht trn th c hng di dng tng qut c th
c pht biu di dng sau: tm ng i ngn nht t mt nh xut pht sV (nh
ngun) n nh cui tV (nh ch). ng i nh vy c gi l ng i ngn nht t
s n t, di ca ng i d(s,t) c gi l khong cch ngn nht t s n t (trong
trng hp tng qut d(s,t) c th m). Nu nh khng tn ti ng i t s n t th di
ng i d(s,t)=. Nu nh mi chu trnh trong th u c di dng th trong ng
i ngn nht s khng c nh no b lp li, ng i nh vy c gi l ng i c bn.
Nu nh th tn ti mt chu trnh no c di m , th ng i ngn nht c th
123
Chng 5: th (Graph)
khng xc nh, v ta c th i qua chu trnh m mt s ln ln di ca n nh
hn bt k mt s thc cho trc no.
5.7.2. Thut ton Dijkstra
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 trng s khng m. Thut ton c thc hin trn
c s gn nhn 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 . Thut ton c th c m t bng th tc Dijkstra
nh sau:
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=1; vn; v++){
d[v] = A[s,v];
truoc[v]=s;
}
d[s]=0; T = V\{s};(*T l tp nh c nhn tm thi*)
while (T!= ) { (* bc lp *)
Tm nh uT sao cho d[u] = min { d[z] : zT}
T= T\{u}; (*c nh nhn nh u*);
For (vT) { (* 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;
}
}
}
}
124
Chng 5: th (Graph)
Input:
125
Chng 5: th (Graph)
126
Chng 5: th (Graph)
BI TP CHNG 5
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
127
Chng 5: th (Graph)
hnh ca tuyn i +1, ni l khong cch ca tuyn bay th i (1<=i<k). Trong , khong cch
ca hnh trnh l tng khong cch ca cc tuyn m hnh trnh i qua (n1+n2+. .+nk).
Cho file d liu kiu text hanhtrinh.in c ghi theo tng dng, s cc dng trong
file d liu khng vt qu N, trn mi dng ghi li thng tin v mt tuyn bay, trong
departure, destination, length c phn bit vi nhau bi mt hoc vi du trng. Hy tm
gii php tho mn nhu cu ca khch hng i t A n B theo mt s tnh hung sau:
Tm hnh trnh c khong cch b nht t A n B. In ra mn hnh tng im m
hnh trnh qua v khong cch ca hnh trnh. Nu hnh trnh khng tn ti hy a ra
thng bo Hnh trnh khng tn ti.
V d v C s d liu hanhtrinh.in
New_York
Chicago
1000
Chicago
Denver
1000
New_York
Toronto
800
New_York
Denver
1900
Toronto
Calgary
1500
Toronto
Los_Angeles
1800
Toronto
Chicago
500
Denver
Urbana
1000
Denver
Houston
1500
Houston
Los_Angeles
1500
Denver
Los_Angeles
1000
128
Chng 5: th (Graph)
A : i ch dng trn xung dng di. V d sau php bin i A, hnh 1 s tr
thnh hnh 2:
B : thc hin mt php hon v vng quanh t tri sang phi trn tng dng. V d
sau php bin i B hnh 1 s tr thnh hnh 3:
C : quay theo chiu kim ng h bn gia. V d sau php bin i C hnh 1
tr thnh hnh 4:
Hnh 1
Hnh 2 Hnh 3
Hnh 4
1 2
8 7
8 7
1 2
8 6
Cho file d liu Input.txt ghi li 8 s nguyn trn mt dng, mi s c phn bit
vi nhau bi mt du trng ghi li trng thi ch. Hy tm dy cc php bin i s bn
a trng thi khi u v trng thi ch sao cho s cc php bin i l t nht c th
c.
D liu ra c ghi li trong file Output.txt, dng u tin ghi li s cc php bin
i, nhng dng tip theo ghi li tn ca cc thao tc c bn thc hin, mi thao tc c
bn c vit trn mt dng.
Bn s c thm 20 im nu s dng bng mu thch hp ca mn hnh m t
li cc php bin i trng thi ca tr chi. V d vi trng thi ch di y s cho ta kt
qu nh sau:
Input.txt
Output.txt
2 6 8 4 5 7 3 1
7
B
C
A
B
C
C
B
Bi 8. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip
t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i],
vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2,
. . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2],
A[i2,i3], . . . A[ik-1,ik]. Cho trc hai nt i v j. Hy tm mt ng truyn tin t nt i
n nt j sao cho chi ph truyn thng l thp nht.
129
Chng 5: th (Graph)
D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi ba
s N, i, j, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.
Kt qu thng bo ra file TEXT c tn OUT.NN. Trong , dng th nht ghi chi
ph truyn thng thp nht t nt i n nt j, dng th 2 ghi ln lt cc nt trn ng
truyn tin c chi ph truyn thng thp nht t nt i ti nt j.
Bi 9. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip
t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i],
vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2,
. . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2],
A[i2,i3], . . . A[ik-1,ik]. Bit rng, gia hai nt bt k ca mng thng tin u tn ti t
nht mt ng truyn tin.
tit kim ng truyn, ngi ta tm cch loi b i mt s ng truyn tin m
vn m bo c tnh lin thng ca mng. Hy tm mt phng n loi b i nhng
ng truyn tin, sao cho ta nhn c mt mng lin thng c chi ph ti thiu nht
c th c.
D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi s
N, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.
Kt qu thng bo ra file TEXT c tn OUT.NN trong dng th nht ghi chi ph
truyn thng nh nht trong ton mng. T dng th 2 ghi ln lt cc nt trn ng
truyn tin, mi ng truyn ghi trn mt dng.
Bi 10. Cho file d liu c t chc ging nh bi 6.6. Hy tm tt c cc hnh trnh i t
im s n t.
Bi 11. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n
t sao cho hnh trnh i qua nhiu node nht.
Bi 12. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n
t sao cho hnh trnh i qua t node nht.
Bi 13. Tm hiu thut ton leo i trn th v ng dng ca n trong lnh vc tr tu
nhn to.
130
6.1. T BI TON
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th
t n nh tng dn (increasing), hoc gim dn (decreasing). Bi ton sp xp xut hin
trong bt k lnh vc no ca tin hc, phc v nhng ng dng ring ca h thng, t
nhng ng dng n bn trong ca H iu hnh nh bi ton iu khin qu trnh ( Proccess
Control Problem), bi ton lp lch cho CPU (CPU Schedulling), bi ton qun l b nh
(Memory Management) . . . cho ti nhng ng dng thng thng nh sp xp dy s, sp
xp cc t, cc cu, cc bn ghi theo th t u c lin quan ti qu trnh sp xp.
Tp i tng cn c sp xp c th xut hin di nhiu dng khc nhau, cc i
tng c th l cc i tng d liu kiu c bn nh sp xp dy s, sp xp k t, sp
xp string hoc l cc i tng tng qut nh mt cu trc bao gm mt s trng thng
tin phn nh i tng. Chng ta qui c i tng cn c sp xp l cc cu trc, v qu
trnh sp xp c thc hin trn mt trng no gi l trng kho.
C nhiu thut ton sp xp khc nhau sp xp cc i tng. Tuy nhin, la
chn mt thut ton sp xp tt, chng ta cn nh gi thut ton theo cc hai kha cnh:
l s chim dng b nh khi p dng gii thut v thi gian thc hin gii thut. i vi
thi gian thc hin gii thut, chng ta cng cn nh gi chi ph thi gian trong trng hp
tt nht, trung bnh v xu nht i vi ngun d liu vo. Chng ta cng ch a ra nhng
131
23
74
11
65
58
94
36
99
87
..........................................................
Ln chn th n-2: Tm trong khong t n-2 n n-1 bng cch thc hin 1 ln so
snh xc nh phn t minn-2 v i ch cho phn t v tr n-2.
ki
42
11
11
11
11
11
11
11
11
11
23
23
23
23
23
23
23
23
23
23
74
74
74
36
36
36
36
36
36
36
11
42
42
42
42
42
42
42
42
42
65
65
65
65
65
58
58
58
58
58
58
58
58
58
58
65
65
65
65
65
132
94
94
94
94
94
94
74
74
74
74
36
36
36
74
74
74
94
87
87
87
99
99
99
99
99
99
99
99
94
94
87
87
87
87
87
87
87
94
99
99
133
...........................................................
Ly tip phn t th ik chn v tr thch hp ca phn t th ik trong tp hai ik1 phn t v thc hin i ch, dy s c sp xp hon ton sau n-1 ln
chn phn t vo v tr thch hp.
...
10
Kho
42
23
74
11
...
36
99
87
42
23
23
11
...
11
11
11
42
42
23
...
23
23
23
74
42
...
42
36
36
74
...
58
42
42
...
65
58
58
...
74
65
65
2
3
4
134
...
74
74
...
94
87
...
99
95
10
...
Thut ton c ci t nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Insert(int *, int);
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Insert(int *A, int n){
register i,j,temp;
for (i=1;i<n;i++){
temp=A[i];
for(j=i-1;j>=0 && temp<A[j];j--)
A[j+1]=A[j];
A[j+1]=temp;
printf("\n");
In(A,i+1);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
135
94
99
136
137
138
23
74
11
65
58
94
36
99
87
Ta chn cht u tin l 42. pht hin ra hai kho cn i ch cho nhau, ta dng
hai bin i, j vi gi tr ban u i=2, j=10. Nu ki < 42 th tip tc tng i v lp li cho ti khi
gp phn t th ki >42. Duyt cc phn t th kj vi 42 nu kj > 42 th j gim i mt, cho
ti khi gp phn t th kj <42 th phn t th ki v kj c i ch cho nhau. Qu trnh s
c lp li vi ki v kj cho ti khi i=j chnh l v tr dnh cho kho 42. Cui cng chng ta
i ch 42 cho kho cho kj.
42
23
74
11
65
58
94
36
99
87
42
23
74
11
65
58
94
36
99
87
42
23
36
11
65
58
94
74
99
87
42
23
36
11
65
58
94
74
99
87
42
23
36
11
65
58
94
74
99
87 (i>j)
11
23
36
42
65
58
94
74
99
87
23
36)
[42]
(65
58
94
74
99
87)
140
36
99
74
65
58
99
94
87
94
36
87
23
11
Hnh 6.1a
65
58
74
42
Hnh 6.1b
chuyn cy nh phn 6.1a thnh cy nh phn 6.1b l mt heap, chng ta thc hin
duyt t di ln (bottom up). Node l ng nhin l mt heap. Nu cy con bn tri v
cy con bn phi u l mt heap th ton b cy cng l mt heap. Nh vy, to thnh
heap, chng ta thc hin so snh ni dung node bn tri, ni dung node bn phi vi node
cha ca n, node no c gi tr ln hn s c thay i lm ni dung ca node cha. Qu
trnh ln ngc li cho ti khi gp node gc, khi ni dung node gc chnh l kho c gi
tr ln nht.
Giai on th hai ca gii thut l a ni dung ca node gc v v tr cui cng v
ni dung ca node cui cng c thay vo v tr node gc, sau coi nh node cui cng
nh b loi b v thc t node cui cng l gi tr ln nht trong dy s.
141
142
23
74
11
68
58
94
36
ln 1: [23
42]
[11
74]
[58
68]
[94
36]
ln 2: [11
23
42
74]
[36
58
68
94]
ln 3: [11
23
42
36
58
68
74
94]
MAX
10
144
145
146
return(mid);
}
return(-1); // X khng thuc dy
}
147
return (mid);
}
return(-1);
}
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Bubble(int *A, int n){
register i,j,temp;
for (i=1; i<n; i++){
for (j=n-1; j>=i;j--){
if (A[j-1]>A[j]){
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
}
}
printf("\n Ket qua lan:%d", i);
In(A,n);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n, X, k;clrscr();
148
149
150
BI TP CHNG 6
Bi 1. Ci t chng trnh theo thut ton Quick Sort khng dng phng php qui m
dng cu trc stack.
Bi 2. Tm hiu v gii thut Shell-Sort l phng php ci tin ca Insertion Sort.
Bi 3. Ci t li gii thut Bubble Sort sao cho cc node nh c y dn v pha trc.
Bi 4. Mt Ternary Heap l cy tam phn gn y c ci t bng mng mt chiu, mi
node c ba node con. Ni dung ca node cha bao gi cng ln hn hoc bng ni
dung ca node con, cc node c nh s t 0 n n-1, node i c 3 con l 3i+1, 3i+2,
3i+3. Hy ci t gii thut Ternary Heap.
Bi 5. Ci t gii thut Bubble Sort trn file.
Bi 6. Ci t gii thut Insertion Sort trn file.
Bi 7. Ci t gii thut Quick Sort trn file.
Bi 8. Ci t cc gii thut sp xp theo nhiu kho khc nhau.
Bi 9. Nghin cu v ci t thut ton tm kim tam phn.
Bi 10. Nghin cu v ci t thut ton sp xp kiu ho nhp thc hin trn file.
Bi 11. Vit chng trnh chuyn i mt file d liu c t chc theo khun dng *.DBF
thnh file kiu text. Ngc li, chuyn i file d liu kiu text thnh mt file d liu
theo khun dng DBF.
Bi 12. Tm hiu cch sp xp v tm kim theo kiu index ca cc h qun tr c s d liu
nh foxprol hoc access.
151
152
Mc lc
MC LC
1.2.
1.2.1.
1.2.2.
1.2.3.
Cu trc d liu......................................................................................7
1.3.
1.3.1.
1.3.2.
Tp cc lnh vo ra c bn...................................................................11
1.3.3.
1.4.
1.5.
1.6.
Nguyn l an ton.........................................................................................16
1.7.
1.8.
2.2.
2.3.
2.4.
2.5.
3.1.1.
3.1.2.
3.1.3.
ng dng ca stack..............................................................................53
153
Mc lc
3.2.
3.2.1.
3.2.2.
3.3.
3.3.1.
3.3.2.
3.4.
4.2.
Cy nh phn.................................................................................................78
4.3.
4.3.1.
4.3.2.
4.4.
4.4.1.
4.4.2.
4.4.3.
4.5.
4.5.1.
4.5.2.
4.5.3.
4.6.
Ci t cy nh phn tm kim......................................................................90
5.1.1.
Cc loi th ....................................................................................103
5.1.2.
Mt s thut ng c bn ca th....................................................106
5.1.3.
5.2.
5.2.1.
5.2.2.
5.2.3.
Mc lc
5.3.
5.3.1.
5.3.2.
5.3.3.
5.3.4.
5.4.
5.5.
5.6.
5.6.1.
5.6.2.
5.6.3.
5.6.4.
5.6.5.
5.7.
5.7.1.
5.7.2.
5.7.3.
t bi ton ................................................................................................131
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.
6.9.
Tm kim (Searching).................................................................................145
6.9.1.
6.9.2.