You are on page 1of 52

BO GIAO DUC VA AO TAO

TRNG AI HOC DAN LAP CU LONG


KHOA CONG NGHE THONG TIN
WX

GIAO TRNH THC HANH

LY THUYET O TH VA
THUAT GIAI

Bien Soan: AO ANH PHA

Vnh Long, 05/2006

Gio Trnh Thc Hnh L Thuyt Th

MC LC
MT S BI TON...................................................................................................2
BI TON 1.................................................................................................................2
BI TON 2.................................................................................................................3
BI TON 3.................................................................................................................4
BI TON 4.................................................................................................................5
BI TON 6.................................................................................................................7
BI TON 7.................................................................................................................8
BI TON 8.................................................................................................................9
BI TON 9...............................................................................................................10
BI TON 10.............................................................................................................11
HNG DN CI T BI TON......................................................................12
BI TON 1...............................................................................................................12
BI TON 2...............................................................................................................17
BI TON 3...............................................................................................................20
BI TON 4...............................................................................................................22
BI TON 5...............................................................................................................25
BI TON 6...............................................................................................................32
BI TON 7...............................................................................................................35
BI TON 8...............................................................................................................38
BI TON 9...............................................................................................................43
BI TON 10.............................................................................................................48

Bin Son: o Anh Pha

Trang 1

Gio Trnh Thc Hnh L Thuyt Th

MT S BI TON
BI TON 1
Vit chng trnh tm bc cao nht ca nh trong th vi th v hng A[i,j]
vi A[i,j]=1 nu c ng i t i n j v ngc li A[i,j] = 0 nu khng c ng i
t i n j.
D liu vo: cho trong file Bai1.inp
- Dng u ghi s n l s nh ca mt th (0<n<100).
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: thng bo kt qu ra mn hnh s bc cao nht ca nh trong th cho.
V d:
Bai1.inp
Kt qu:
6
011000
100110
100010
010010
011101
000010

Bac cao nhat: 4

Bai1.inp

Kt qu:

5
01001
10111
01001
01001
11110

Bac cao nhat: 4

Yu cu x l:
a) Tm nh c bc cao nht.
b) Tm bc nh nht ca nh.
c) Tm nh c bc nh nht.
d) Tnh tng bc ca th.
e) m s nh bc chn v bc l.
Kt qu:
V d:
a) nh 2,5.
b) Bc 2.
c) nh 1,3,4.
d) Tng bc ca th 14.
e) S nh bc chn 5, s nh bc l 0.

Bin Son: o Anh Pha

Trang 2

Gio Trnh Thc Hnh L Thuyt Th

BI TON 2
Vit chng trnh kim tra tnh lin thng ca mt th v hng A[i,j] vi A[i,j]=1
nu c ng i t i n j v ngc li A[i,j] = 0 nu khng c ng i t i n j.
D liu vo: cho trong file Bai2.inp
- Dng u ghi s n l s nh ca mt th (0<n<100).
- Dng i+1 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: thng bo kt qu ra mn hnh DO THI LIEN THONG hay DO THI KHONG
LIEN THONG.

V d:
Bai2.inp

Kt qu:

5
00001
00100
01010
00101
10010

DO THI LIEN THONG

Bai2.inp

Kt qu:

8
01000100
10100000
01010000
00101000
00010100
10001010
00000101
00000010

DO THI LIEN THONG

Bai2.inp

Kt qu:

6
011000
101000
110000
000011
000101
000110

DO THI KHONG LIEN THONG

Bin Son: o Anh Pha

Trang 3

Gio Trnh Thc Hnh L Thuyt Th

BI TON 3
Vit chng trnh m s thnh phn lin thng ca th v hng Anxn vi:
- A[i,j] = 1 nu c ng i t i n j.
- A[i,j] = 0 nu khng c ng i t i n j.
- A[i,j] = A[j,i].
D liu vo: cho trong file Bai2.inp ni dung d liu ging d liu Bi Ton 2.
D liu ra: hin th s thnh phn lin thng ca th ra mn hnh.
V d:
Bai3.inp
Kt qu:
6
011000
101000
110000
000011
000101
000110

Bai3.inp

Kt qu:

5
00001
00100
01010
00101
10010

Bai3.inp

Kt qu:

8
01000100
10100000
01010000
00101000
00010100
10001010
00000101
00000010

Bin Son: o Anh Pha

Trang 4

Gio Trnh Thc Hnh L Thuyt Th

BI TON 4
C n thnh ph bit rng ng i gia hai cc thnh ph (nu c) l ng i hai
chiu. S mng li giao thng ca n thnh ph cho bi ma trn Anxn trong :
a. A[i,j] = 1 nu c ng i t thnh ph i n thnh ph j.
b. A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
c. A[i,j] = A[j,i].
Hy xc nh mi ng t thnh ph D n thnh ph C (nu c).
D liu vo: cho trong file Bai4.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: Xut ra mn hnh mi ng i t nh D n C hay thng bo khng tn
ti ng i t D n C.
V d:
Bai4.inp
Kt qu:
5
15
01001
10110
01010
01101
10010

1->2->3->4->5
1->2->4->5
1->5

Bai3.inp

Kt qu:

5
15
01011
10101
01010
10101
11010

1->2->3->4->5
1->2->5
1->4->3->2->5
1->4->5
1->5

Bai4.inp

Kt qu:

6
14
011000
101000
110000
000011
000101
000110

KHONG CO DUONG DI TU 1 DEN 4

Bin Son: o Anh Pha

Trang 5

Gio Trnh Thc Hnh L Thuyt Th

BI TON 5
Mt li giao thng hai chiu gia n a im c cho bi ma trn A[i,j] trong
A[i,j]=1 nu c ng i t i n j, cn A[i,j] = 0 trong trng hp ngc li. Mt
ngi a th cn i qua tt c cc con ng ny pht th, mi ng ch qua
mt ln. Hy xc nh mt l trnh ca ngi a th ny (c th tn ti nhiu l
trnh khc nhau) hay thng bo khng tn ti ng nh vy.
D liu vo: cho trong file Bai5.inp.
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: In ra mn hnh ng i ca ngi a th (nu c).
V d:
Bai5.inp
Kt qu:
5
01000
10111
01010
01101
01010

1->2->3->4->2->5->4

Bai5.inp

Kt qu:

5
01000
10111
01011
01101
01110

KHONG TON TAI DUONG DI

Bai5.inp

Kt qu:

5
01001
10110
01010
01101
10010

2->1->5->4->2->3->4

Bin Son: o Anh Pha

Trang 6

Gio Trnh Thc Hnh L Thuyt Th

BI TON 6
Mt ngi khch du lch mun i thm n thnh ph c nh s t 1 n n, mi
thnh ph ngi khch ch mun i qua chng mt ln. Mng li giao thng gia n
thnh ph l hai chiu v c cho bi ma trn A[i,j] trong A[i,j] =1 nu c
ng i gia thnh ph i v thnh ph j, A[i,j] = 0 trong trng hp ngc li.
Hy vit chng trnh thit lp cho ngi khch mt l trnh (c th tn ti
nhiu l trnh) hay thng bo khng tn ti l trnh theo yu cu ca khch.
D liu vo: cho trong file Bai6.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng 2 ghi nh m ngi khch du lch xut pht.
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: In ra mn hnh ng i ca ngi khch (nu c).
V d:
Bai6.inp
Kt qu:
5
1
01000
10111
01010
01101
01010

1->2->3->4->5

Bai6.inp

Kt qu:

6
1
011000
101010
110001
000010
010100
001000

KHONG TON TAI DUONG DI

Bai6.inp

Kt qu:

6
1
011000
101000
110000
000011
000101
000110

KHONG TON TAI DUONG DI

Bin Son: o Anh Pha

Trang 7

Gio Trnh Thc Hnh L Thuyt Th

BI TON 7
C n thnh ph bit rng ng i gia cc thnh ph l ng i hai chiu. S
mng li giao thng ca n thnh ph cho bi ma trn A[i,j] trong :
- A[i,j] l di ng i t thnh ph i n thnh ph j.
- A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
- A[i,j] = A[j,i]
- A[i,j] nguyn, khng m.
Hy xc nh ng i ngn nht t thnh ph D n thnh ph C.
D liu vo: th lin thng v cho trong file Bai7.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh ng i ngn nht t nh D n C v gi tr ng i
ngn nht tm c.
V d:
Bai7.inp

Kt qu:

DUONG DI NGAN NHAT LA: 5

16

1->2->4->6

012000
102230
220540
025032
034304
000240

Bai7.inp

Kt qu:

DUONG DI NGAN NHAT LA: 8

16
014000
102650
420730
067001
053003
000130

1->2->4->6

Bin Son: o Anh Pha

Trang 8

Gio Trnh Thc Hnh L Thuyt Th

BI TON 8
Mt cng ty cn thay ton b h thng dy in cho n phng lm vic. Cho bit s
in hin c ca n cn phng ny c biu din bng ma trn A[i,j] trong :
- A[i,j]=A[j,i] chnh l chiu di dy in ni lin gia hai phng i v j.
- A[i,j] = A[j,i] = 0 nu i khng ni lin vi j.
Hy lp trnh tnh di cu dy dn cn s dng sao cho c n phng iu c
in v s lng ny l t nht.
D liu vo: cho trong file Bai8.inp ( th cho lin thng).
- Dng u ghi s n l s nh ca mt th (0<n<100)
Dng i+1 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: lu trong file Bai8.out vi ni dung sau:
- Dng u lu di dy dn nh nht
- Cc dng cn li lu ng i cn ni in gia nh i ni vi nh j c
trng s A[i,j] (i -> j = A[i][j]).
-

V d:
Bai8.inp

Bai8.out

5
03322
30232
32014
23104
22440

7
1 -> 4 = 2
4 -> 3 = 1
1 -> 5 = 2
3 -> 2 = 2

Bai8.inp
8
02340000
20304000
33076520
40700030
04600408
00504016
00230105
00008650

Bai8.out
20
1 -> 2 = 2
1 -> 3 = 3
3 -> 7 = 2
7 -> 6 = 1
7 -> 4 = 3
2 -> 5 = 4
7 -> 8 = 5

Bin Son: o Anh Pha

Trang 9

Gio Trnh Thc Hnh L Thuyt Th

BI TON 9
C n thnh ph c nh s t 1 n n. Mng li giao thng gia cc thnh ph l
ng hai chiu. Trn ng i t thnh ph i n thnh ph j, ngi ta khng c
mang qu A[i,j] n v hng. Nu khng c ng i t thnh ph i n thnh ph j
th xem nh A[i,j] = 0. Cn vn chuyn hng t thnh ph D n thnh ph C. Hy
thit lp k hoch vn chuyn sao cho khi lng hng vn chuyn l nhiu nht.
D liu vo: th lin thng v cho trong file Bai9.inp vi ni dung
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh k hoch vn chuyn t nh D n C v gi tr ng
i ngn nht tm c.
V d:
Bai9.inp
Kt qu:
6
16
012000
102230
220540
025032
034304
000240

KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 2


1->3->4->6

Bai9.inp
Kt qu:
6
16
014000
102650
420730
067001
053003
000130

Bin Son: o Anh Pha

KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 3


1->3->4->2->5->6

Trang 10

Gio Trnh Thc Hnh L Thuyt Th

BI TON 10
C n thnh ph bit rng ng i gia cc thnh ph l ng i hai chiu. S
mng li giao thng ca n thnh ph cho bi ma trn A[i,j] trong :
- A[i,j] l di ng i t thnh ph i n thnh ph j.
- A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
- A[i,j] = A[j,i].
- A[i,j] nguyn, khng m.
Hy xc nh ng i di nht t thnh ph D n thnh ph C vi iu kin thnh
ph qua khng c i li.
D liu vo: th lin thng v cho trong file Bai10.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh ng i di nht t nh D n C v gi tr ng i
ngn nht tm c.
V d:
Bai10.inp

Kt qu:

DUONG DI DAI NHAT LA: 16

16

1->2->4->3->5->6

012000
102230
220540
025032
034304
000240

Bai10.inp

Kt qu:

DUONG DI DAI NHAT LA: 25

16
014000
102650
420730
067001
053003
000130

1->3->4->2->5->6

Bin Son: o Anh Pha

Trang 11

Gio Trnh Thc Hnh L Thuyt Th

HNG DN CI T BI TON
BI TON 1
Vit chng trnh tm bc cao nht ca nh trong th vi th v hng A[i,j]
vi A[i,j]=1 nu c ng i t i n j v ngc li A[i,j] = 0 nu khng c ng i
t i n j.
D liu vo: cho trong file Bai1.inp
- Dng u ghi s n l s nh ca mt th (0<n<100).
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: thng bo kt qu ra mn hnh s bc cao nht ca nh trong th cho.
V d:
Bai1.inp
Kt qu:
6
011000
100110
100010
010010
011101
000010

Bac cao nhat: 4

Bai1.inp

Kt qu:

5
01001
10111
01001
01001
11110

Bac cao nhat: 4

Yu cu x l:
f) Tm nh c bc cao nht.
g) Tm bc nh nht ca nh.
h) Tm nh c bc nh nht.
i) Tnh tng bc ca th.
j) m s nh bc chn v bc l.
V d:

Bin Son: o Anh Pha

Kt qu:
f) nh 2,5.
g) Bc 2.
h) nh 1,3,4.
i) Tng bc ca th 14.
S nh bc chn 5, s nh bc l 0.

Trang 12

Gio Trnh Thc Hnh L Thuyt Th


HNG DN CI T

Tng s phn t khc khng trn dng i ca ma trn lin kt ca th chnh


l s bc ca nh i (i=1..n).
9 Bc ln nht ca nh: Tnh bc tng nh ca th, so snh tm ra bc ln nht.
9 nh c bc ln nht: Tnh bc tng nh ca th, so snh vi bc ln nht ca
th nu bng th xut nh c bc ln nht ra mn hnh.
9 Bc nh nht ca nh: Tnh bc tng nh ca th, so snh tm ra bc nh nht.
9 nh c bc nh nht: Tnh bc tng nh ca th, so snh vi bc nh nht ca
th nu bng th xut nh c bc nh nht ra mn hnh.
9 Tm nh bc l v s nh bc l: Tnh bc tng nh ca th, kim tra nh
tng ng c phi l bc l hay khng nu phi xut ra mn hnh v tng s nh
bc l ln 1.
9 Tm nh bc chn v s nh bc chn: tng t nh tm s nh bc l.
9 Tng bc ca th: Tng tt c cc phn t khc khng ca ma trn lin kt chnh
l tng s bc ca th.
CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <values.h>
#define TenFile "Bai1.inp"
/*Dc file d liu bi ton*/
void Doc_File(int **A,int &n) {
FILE*f = fopen(TenFile,"rb");
fscanf(f,"%d",&n);
*A = new int [n];
cout<<"Ma Tran Lien Ket Cua Do Thi";
for(int i =0;i<n;i++) {
A[i] = new int [n];
cout<<endl;
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<" "<<A[i][j];
}
}
fclose(f);
}
/*Bc ln nht ca nh*/
int BacLonNhat(int**A,int n) {
int max = 0,Bac;

Bin Son: o Anh Pha

Trang 13

Gio Trnh Thc Hnh L Thuyt Th


for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac > max)
max = Bac;
}
return max;
}
/*Bc nh nht ca nh*/
int BacNhoNhat(int**A,int n){
int min = MAXINT,Bac;
for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac < min)
min = Bac;
}
return min;
}
/*Tng bc ca th*/
int TongBac(int**A,int n){
int Tong = 0;
for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Tong++;
return Tong;
}
/*Cc nh c bc nh nht*/
void DinhBacNhoNhat(int**A, int n){
int min = BacNhoNhat(A,n), Bac;
for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac == min)
cout<<" "<<i+1;
Bin Son: o Anh Pha

Trang 14

Gio Trnh Thc Hnh L Thuyt Th


}
}
/*Cc nh c bc ln nht*/
void DinhBacLonNhat(int**A, int n){
int max = BacLonNhat(A,n), Bac;
for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac == max)
cout<<" "<<i+1;
}
}
/*Cc nh bc chn v s nh bc chn*/
void DinhBacChan(int**A, int n) {
int Bac,Tong=0;
for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac%2==0) {
cout<<" "<<i+1;
Tong++;
}
}
cout<<"\n\t So Dinh Bac Chan: "<<Tong;
}
/*Cc nh bc l v s nh bc l*/
void DinhBacLe(int**A, int n){
int Bac,Tong=0;
for(int i = 0; i<n; i++) {
Bac = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
Bac++;
if(Bac%2==1) {
cout<<" "<<i+1;
Tong++;
}
}
Bin Son: o Anh Pha

Trang 15

Gio Trnh Thc Hnh L Thuyt Th


cout<<"\n\t So Dinh Bac Le: "<<Tong;
}
/*Chuong Trinh Chinh*/
void main() {
clrscr();
int **A,n;
Doc_File(A,n);
cout<<"\n1. Bac Lon Nhat Cua Dinh: "<<BacLonNhat(A,n);
cout<<"\n2. Dinh Co Bac Lon Nhat:";
DinhBacLonNhat(A,n);
cout<<"\n3. Bac Nho Nhat Cua Dinh: "<<BacNhoNhat(A,n);
cout<<"\n4. Dinh Co Bac Nho Nhat:";
DinhBacNhoNhat(A,n);
cout<<"\n5. Dinh Co Bac Chan:";
DinhBacChan(A,n);
cout<<"\n6. Dinh Co Bac Le:";
DinhBacLe(A,n);
cout<<"\n7. Tong Bac Cua Do Thi: "<<TongBac(A,n);
delete*A;
getch();
}

Bin Son: o Anh Pha

Trang 16

Gio Trnh Thc Hnh L Thuyt Th

BI TON 2
Vit chng trnh kim tra tnh lin thng ca mt th v hng A[i,j] vi A[i,j]=1
nu c ng i t i n j v ngc li A[i,j] = 0 nu khng c ng i t i n j.
D liu vo: cho trong file Bai2.inp
- Dng u ghi s n l s nh ca mt th (0<n<100).
- Dng i+1 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: thng bo kt qu ra mn hnh DO THI LIEN THONG hay DO THI KHONG
LIEN THONG.

V d:
Bai2.inp

Kt qu:

5
00001
00100
01010
00101
10010

DO THI LIEN THONG

Bai2.inp

Kt qu:

8
01000100
10100000
01010000
00101000
00010100
10001010
00000101
00000010

DO THI LIEN THONG

Bai2.inp

Kt qu:

6
011000
101000
110000
000011
000101
000110

DO THI KHONG LIEN THONG

Bin Son: o Anh Pha

Trang 17

Gio Trnh Thc Hnh L Thuyt Th


HNG DN THUT TON

tng: S dng thut ton loang .


Bc 1: Xut pht t mt nh bt k ca th. Ta nh du nh xut pht v chuyn
sang bc 2.
Bc 2: T mt nh i nh du, ta nh du nh j nu A[i,j] = 1 v j cha c nh
du v chuyn sang bc 3.
Bc 3: Thc hin bc 2 cho n khi khng cn thc hin c na chuyn sang
bc 4.
Bc 4: Kim tra nu s nh nh du nh hn n (hay tn ti t nht mt nh cha c
nh du) th s khng lin thng v ngc li th lin thng.
HNG DN CI T

T chc cu trc d liu lu tr s nh du cc nh ca th.


Ta t chc mt mng 1 chiu (char*DanhDau) lu tr nhng nh ca th
c c nh du hay khng. Ch s ca mng chnh l ch s nh ca th.
DanhDau[i]=0 nu nh i cha c nh du v DanhDau[i]=1 nu nh i
c nh du. V d: DanhDau[5]=1, DanhDau[3]=0 c ngha l nh th 5 ca
th c dnh u v nh th 3 ca th cha c dnh du.
Trong thut ton, trc tin ta khi to tt c cc nh ca th l cha c
nh du. Ngha l DanhDau[i]=0, i=0..n-1.
o Dnh du nh du tin ca th (DanhDau[0]=1).
o T nh i nh du (DanhDau[i]=1), ta nh du nh j (DanhDau[j]=1)
nu A[i][j] = 1 v j cha c nh du (DanhDau[j]=0). C tip tc nh vy
cho n khi khng thc hin c na.
o Nu nh no cha nh du (tn ti DanhDau[k]=0, 0k<n) th th
khng lin thng v ngc li.
CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define TenFile "Bai2.inp"
/*Dc file d liu*/
void Doc_File(int **A,int &n){
FILE*f = fopen(TenFile,"rb");
fscanf(f,"%d",&n);
*A = new int [n];
cout<<"Ma Tran Lien Ket Cua Do Thi";
for(int i =0;i<n;i++) {
A[i] = new int [n];
cout<<endl;

Bin Son: o Anh Pha

Trang 18

Gio Trnh Thc Hnh L Thuyt Th


for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<" "<<A[i][j];
}
}
fclose(f);
}
/*Kim tra lin thng: Nu lin thng tr v gi tr 1, ngc li tr v gi tr 0*/
char Lien_Thong(int **A,int n) {
char*DanhDau = new char [n];
char ThanhCong;
int Dem=0;
for(int i = 0; i<n; i++)
DanhDau[i] = 0;
DanhDau[0] = 1;
Dem++;
do { ThanhCong =1;
for(i = 0; i<n; i++)
if(DanhDau[i]==1) {
for(int j = 0; j<n; j++)
if (DanhDau[j] == 0 && A[i][j] > 0) {
DanhDau[j] = 1;
ThanhCong =0;
Dem++;
if(Dem == n) return 1;
}
}
}while (ThanhCong == 0);
return 0;
}
/*Chng trnh chnh*/
void main() {
clrscr();
int **A,n;
Doc_File(A,n);
if (Lien_Thong(A,n)==1)
cout<<"\nDO THI LIEN THONG";
else cout<<"\nDO THI KHONG LIEN THONG";
delete *A;
getch();
}

Bin Son: o Anh Pha

Trang 19

Gio Trnh Thc Hnh L Thuyt Th

BI TON 3
Vit chng trnh m s thnh phn lin thng ca th v hng Anxn vi:
- A[i,j] = 1 nu c ng i t i n j.
- A[i,j] = 0 nu khng c ng i t i n j.
- A[i,j] = A[j,i].
D liu vo: cho trong file Bai2.inp ni dung d liu ging d liu Bi Tp2.
D liu ra: hin th s thnh phn lin thng ca th ra mn hnh.
V d:
Bai3.inp
Kt qu:
6
011000
101000
110000
000011
000101
000110

Bai3.inp

Kt qu:

5
00001
00100
01010
00101
10010

Bai3.inp
8
01000100
10100000
01010000
00101000
00010100
10001010
00000101
00000010

Kt qu:
1

HNG DN THUT TON

tng: S dng thut ton loang ging nh bi ton 1.


Bc 0: Khi to s thnh phn lin thng bng 0.
Bc 1: Xut pht t mt nh cha c nh du ca th. Ta nh du nh
xut pht, tng s thnh phn lin thng ln 1 v chuyn sang bc 2.
Bc 2: T mt nh i nh du, ta nh du nh j nu A[i,j] = 1 v j cha c nh
du v chuyn sang bc 3.
Bin Son: o Anh Pha

Trang 20

Gio Trnh Thc Hnh L Thuyt Th

Bc 3: Thc hin bc 2 cho n khi khng cn thc hin c na chuyn sang


bc 4.
Bc 4: Nu s s nh nh du bng n (mi nh u c nh du) kt thc thut
ton, ngc li quay v bc 1.
Ch : Nu s thnh phn lin thng bng 1 th lin thng.
HNG DN CI T

Ci t tng t nh bi ton 2.
CHNG TRNH MU
/*Hm tr v s thnh phn lin thng ca th v hng */
int TPLien_Thong(int **A, int n) {
char*DanhDau = new char [n];
char ThanhCong;
int Dem=0, i,j, MLT=0;
for( i = 0; i<n; i++)
DanhDau[i] = 0;
do { j = 0;
while(DanhDau[j]==1)
j++;
DanhDau[j] = 1;
Dem++;
MLT++;
do {
ThanhCong =0;
for(i = 0; i<n; i++)
if(DanhDau[i]==1)
for(j = 0; j<n; j++)
if (DanhDau[j] == 0 && A[i][j] > 0) {
DanhDau[j] = 1;
ThanhCong =1;
Dem++;
if(Dem == n) return MLT;
}
}while (ThanhCong == 1);
} while(Dem<n);
return MLT;
}

Bin Son: o Anh Pha

Trang 21

Gio Trnh Thc Hnh L Thuyt Th

BI TON 4
C n thnh ph bit rng ng i gia hai cc thnh ph (nu c) l ng i hai
chiu. S mng li giao thng ca n thnh ph cho bi ma trn Anxn trong :
d. A[i,j] = 1 nu c ng i t thnh ph i n thnh ph j.
e. A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
f. A[i,j] = A[j,i].
Hy xc nh mi ng t thnh ph D n thnh ph C (nu c).
D liu vo: th lin thng v cho trong file Bai4.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: Xut ra mn hnh mi ng i t nh D n C hay thng bo khng tn
ti ng i t D n C.
V d:
Bai4.inp
Kt qu:
5
15
01001
10110
01010
01101
10010

1->2->3->4->5
1->2->4->5
1->5

Bai3.inp

Kt qu:

5
15
01011
10101
01010
10101
11010

1->2->3->4->5
1->2->5
1->4->3->2->5
1->4->5
1->5

Bai4.inp

Kt qu:

6
14
011000
101000
110000
000011
000101
000110

KHONG CO DUONG DI TU 1 DEN 4

Bin Son: o Anh Pha

Trang 22

Gio Trnh Thc Hnh L Thuyt Th

HNG DN THUT TON


S dng k thut tm kim theo chiu su.
HNG DN CI T
S dng k thut ci t tm kim theo phng php quy.
CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define FileIn "Bai4.inp"
int Dem = 0;
//Dm s ng i
int*L;
//Lu li ng i
char*DanhDau;
//nh du nh i
int **A,n,D,C;
/*Dc file d liu theo yu cu ca chng trnh*/
void Doc_File(){
FILE*f = fopen(FileIn,"rb");
fscanf(f,"%d%d%d",&n,&D,&C);
cout<<"Ma Tran Lien Ket Tuong Ung.\n";
cout<<D<<" "<<C<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";
}
cout<<endl;
}
fclose(f);
D--;
C--;
}
/*Khi to cc tham s ban u cho chng trnh*/
void KhoiTao() {
DanhDau = new char [n];
L = new int [n];
for (int i = 0; i<n; i++) {
//Tt c cc nh cha c nh du
DanhDau[i] = 0;
L[i] = 0;
}

Bin Son: o Anh Pha

Trang 23

Gio Trnh Thc Hnh L Thuyt Th


DanhDau[D] = 1;
L[0] = D;

//nh du nh u tin
//Lu li nh u tin l nh xut pht

}
void InDuongDi(int SoCanh) {
Dem++;
cout<<endl<<D+1;
for (int i = 1; i<SoCanh; i++)
cout<<" -> "<<L[i]+1;
}
/*Th tc quy tm kim ng i*/
void TimKiem(int SoCanh) {
if(L[SoCanh-1] == C) InDuongDi(SoCanh);
else {
for(int i = 0; i<n; i++)
if( A[L[SoCanh-1]][i]>0 && DanhDau[i] == 0){
L[SoCanh] = i;
DanhDau[i] = 1;
TimKiem(SoCanh+1);
//Tm kim nh tip theo
L[SoCanh] = 0;
DanhDau[i] = 0;
}
}
}
/*Chng trnh chnh*/
void main() {
clrscr();
Doc_File();
KhoiTao();
cout<<"Duong di tu "<<D+1<<" den "<<C+1;
TimKiem(1);
if(Dem==0)
cout<<" khong co";
delete*A,DanhDau,L;
getch();
}

Bin Son: o Anh Pha

Trang 24

Gio Trnh Thc Hnh L Thuyt Th

BI TON 5
Mt li giao thng hai chiu gia n a im c cho bi ma trn A[i,j] trong
A[i,j]=1 nu c ng i t i n j, cn A[i,j] = 0 trong trng hp ngc li. Mt
ngi a th cn i qua tt c cc con ng ny pht th, mi ng ch qua
mt ln. Hy xc nh mt l trnh ca ngi a th ny (c th tn ti nhiu l
trnh khc nhau) hay thng bo khng tn ti ng nh vy.
D liu vo: cho trong file Bai5.inp.
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: In ra mn hnh ng i ca ngi a th (nu c).
V d:
Bai5.inp
Kt qu:
5
01000
10111
01010
01101
01010

1->2->3->4->2->5->4

Bai5.inp
5
01000
10111
01011
01101
01110

Kt qu:
KHONG TON TAI DUONG DI

Bai5.inp

Kt qu:

5
01001
10110
01010
01101
10010

2->1->5->4->2->3->4

HNG DN THUT TON


Bi ton 5 chnh l bi ton tm ng i Euler. iu kin c ng i
Euler l:
- th lin thng.
- th c khng qu 2 nh bc l. Nu c 2 nh bc l th nh xut pht
tm ng i phi l nh bc l.

Bin Son: o Anh Pha

Trang 25

Gio Trnh Thc Hnh L Thuyt Th

tng thut ton: S dng k thut xo cnh. Ngha l, khi ta i qua bt k


cnh no ta phi xo cnh tng ng bng cch gn trng s ng i ca cnh mi
i qua bng 0. Thut ton kt thc khi ta i qua tt c cc cnh ca th khi ma
trn trn lin kt ca th bng 0.
HNG DN CI T
Ci t hm kim tra tnh lin thng ca th nu lin thng tr v kt qu 1
ngc li tr v kt qu 0.
Ci t hm kim tra th c tha mn tn ti khng qu 2 nh bc l nu
tha mn tr v kt qu 1 ngc li tr v kt qu 0. Nu tn ti nh bc l th
nh bc l chnh l nh xut pht v trong qu trnh kim tra chng ta m
lun s cnh ca th. Bi v thut ton kt thc khi ta i ht tt c mi cnh
ca th.
Ci t thut ton tm ng i Euler: trc tin kim tra xem th co tha
mn iu kin tn ti ng i Euler hay cha nu khng tha mn th thut
ton kt thc. Ngc li ta tm ng i Euler nh sau:
- Chn nh xut pht: nu tn ti nh bc l th chn nh bc l lm nh
xut pht, nu khng tn ti nh bc l th chn 1 nh bt k thng
thng ta chn nh 1 lm nh xut pht.
- T nh xut pht ta i ti nh k n v xa cnh tng ng. Nu j l nh
k vi nh xut pht th A[xut pht][j]= A[j][xut pht] = 0 v nh xut
pht ta gn bng nh j. Lp li cho n khi khng cn i c na (i qua
mi cnh ca th) th thut ton kt thc.
CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <values.h>
#define TenFile "Bai5.inp"
/*Dc d liu ca bi ton*/
void Doc_File(int **A,int &n) {
FILE*f = fopen(TenFile,"rb");
fscanf(f,"%d",&n);
*A = new int [n];
cout<<"Ma Tran Lien Ket Cua Do Thi";
for(int i =0;i<n;i++) {
A[i] = new int [n];
cout<<endl;
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);

Bin Son: o Anh Pha

Trang 26

Gio Trnh Thc Hnh L Thuyt Th


cout<<" "<<A[i][j];
}
}
fclose(f);
}
/*Kim tra tnh lin thng ca th.
th lin thng th hm tr v gi tr 1, ngc li hm tr v gi tr 0.*/
char LienThong(int **A,int n) {
char*DanhDau = new char [n];
char ThanhCong;
int Dem=0;
for(int i = 0; i<n; i++)
DanhDau[i] = 0;
DanhDau[0] = 1;
Dem++;
do {
ThanhCong =1;
for(i = 0; i<n; i++)
if(DanhDau[i]==1) {
for(int j = 0; j<n; j++)
if (DanhDau[j] == 0 && A[i][j] > 0) {
DanhDau[j] = 1;
ThanhCong =0;
Dem++;
if(Dem == n) return 1;
}
}
}while (ThanhCong == 0);
return 0;
}
/*Kim tra th c qu 2 nh bc l hay khng.
Nu qu 2 nh bc l hm tr v gi tr 0, ngc li hm tr v gi tr 1.
Tm nh xut pht lu trong bin XP v tng s cnh lu trong bin Canh*/
char KiemTraBacLe(int**A, int n,int &XP, int &Canh) {
int BacDinh,BacLe=0;
Canh = 0;
XP = 0;
for(int i = n-1; i>=0; i--) {
BacDinh = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
BacDinh++;
Bin Son: o Anh Pha

Trang 27

Gio Trnh Thc Hnh L Thuyt Th


if(BacDinh%2==1) {
XP= i;
BacLe++;
}
Canh+=BacDinh;
}
Canh = Canh/2;
if(BacLe>2) return 0;
else
return 1;
}
/*Tim mot duong di Euler*/
void Euler(int**A,int n){
int XuatPhat,SoCanh,Dem;
int *LuuDuong;
if(LienThong(A,n)==1 && KiemTraBacLe(A,n,XuatPhat,SoCanh)==1){
LuuDuong = new int[SoCanh+1];
LuuDuong[0] = XuatPhat;
Dem = 1;
do{
int j = 0;
while(A[XuatPhat][j]==0)
j++;
A[XuatPhat][j] = A[j][XuatPhat] = 0;
LuuDuong[Dem] = XuatPhat = j;
Dem++;
}while(Dem<=SoCanh);
cout<<"\nDuong Di Cua Nguoi Dua Tho:\n"<<LuuDuong[0]+1;
for(int i = 1; i<=SoCanh; i++)
cout<<" -> "<<LuuDuong[i]+1;
}else
cout<<"\nKhong ton tai duong di.";
}
/*Chng trnh chnh*/
void main() {
clrscr();
int **A,n;
Doc_File(A,n);
Euler(A,n);
delete*A;
getch();
}

Bin Son: o Anh Pha

Trang 28

Gio Trnh Thc Hnh L Thuyt Th

CI TIN THUT TON X L CC TRNG HP C BIT


1. Trng hp th c 2 nh bc l trong c 1nh bc 1.
Xt th:

Nu chng ta xut pht t nh 4. Khi chng ta i 4->2->1 th ca ta s


tng ng vi thut ton xo cnh l:

Khi im xut pht ca ta s bt u t nh 1, ti nh ny chng ta s


khng cn ng i na v n l nh c lp. khc phc c hin trng ny
chng ta phi chn u tin nh xut pht l nh c bc 1 v nh kt thc s l nh
bc l cn li.
Bai5.inp
Kt qu:
6
001010
000111
100010
010000
111001
010010

4->2->5->1->3->5->6->2

Hm ci tin kim tra nh bc l v chon nh xut pht.


char KiemTraBacLe(int**A, int n,int &XP, int &Canh) {
int BacDinh,BacLe=0,T=0;
Canh = XP = 0;
for(int i = 0; i<n; i++) {
BacDinh = 0;
for(int j = 0; j<n; j++)
if(A[i][j]>0)
BacDinh++;
if(BacDinh%2==1) {
if(BacDinh==1) {
T = 1;
XP= i;
}

Bin Son: o Anh Pha

Trang 29

Gio Trnh Thc Hnh L Thuyt Th


if(T = 0)
XP = i;
BacLe++;
}
Canh+=BacDinh;
}
Canh = Canh/2;
if(BacLe>2) return 0;
else return 1;
}

2. Trng hp th c 2 nh bc l trong c 2 nh bc 1.
X l tng t nh trng hp 1 nhng ta phi lu vt ng i i qua
trnh trng hp ng i sau khi xa th nh tng ng xut pht l nh c lp. C
nhiu cch lu vt, tm kim bng phng php quy l mt trong nhng cnh
lu vt hiu qu v n gin. Tuy nhin phc tp ca thut ton qu ln nn trong
thc t ngi ta ch s dng phng php ny.
3. K thut tm kim quy tm ng i Euler.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define Filename "Bai5.inp"
/*Khai bo cc bin ton cc*/
int Dem = 0;
//m s ng i
int*L;
//Lu li nh i
int **A,n
int XuatPhat=0;
//nh xut pht tm kim l nh bc l nu th c nh bc l
int SoCanh=0;
//Lu s cnh ca th v ng i i qua tt c cc cnh
/*Dc file d liu v khi to ban u*/
void Doc_File(){
int BacDinh;
FILE*f = fopen(Filename,"rb");
fscanf(f,"%d",&n);
cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<n<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
BacDinh = 0;
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";

Bin Son: o Anh Pha

Trang 30

Gio Trnh Thc Hnh L Thuyt Th


if(A[i][j] == 1)

BacDinh++;

}
if(BacDinh%2==1) XuatPhat = i;
SoCanh+=BacDinh;
cout<<endl;
}
fclose(f);
SoCanh = SoCanh/2;
L = new int [SoCanh+1];
L[0] = XuatPhat;

//Xut pht l nh bc l

//S cnh = tng bc /2


//Khi to lu nh

}
/*Xut ng i tm c ra mn hnh*/
void InDuongDi() {
Dem++;
cout<<endl<<XuatPhat+1;
for (int i = 1; i<=SoCanh; i++)
cout<<" -> "<<L[i]+1;
}
/*Th tc tm kim quy*/
void TimKiem(int Canh) {
/*Tm cho n khi cnh tm c ln hn s cnh ca th mi xut ng i*/
if(Canh > SoCanh && Dem ==0 ) InDuongDi();
else {
for(int i = 0; i<n; i++)
if( A[L[Canh-1]][i]>0 && Dem==0){
L[Canh] = i;
A[L[Canh-1]][i]=A[i][L[Canh-1]]=0;
//Xa cnh
TimKiem(Canh+1);
//Tm nh tip theo
A[L[Canh-1]][i]=A[i][L[Canh-1]]=1;
//Phc hi cnh
L[Canh] = 0;
}
}
}
void main() {
Doc_File();
cout<<"\nDUONG DI";
TimKiem(1);
if(Dem==0)
cout<<" KHONG CO";
delete*A,L;
getch();
}
Bin Son: o Anh Pha

Trang 31

Gio Trnh Thc Hnh L Thuyt Th

BI TON 6
Mt ngi khch du lch mun i thm n thnh ph c nh s t 1 n n, mi
thnh ph ngi khch ch mun i qua chng mt ln. Mng li giao thng gia n
thnh ph l hai chiu v c cho bi ma trn A[i,j] trong A[i,j] =1 nu c
ng i gia thnh ph i v thnh ph j, A[i,j] = 0 trong trng hp ngc li.
Hy vit chng trnh thit lp cho ngi khch mt l trnh (c th tn ti
nhiu l trnh) hay thng bo khng tn ti l trnh theo yu cu ca khch.
D liu vo: cho trong file Bai6.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng 2 ghi nh m ngi khch du lch xut pht.
- Dng i+1 ( 1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: In ra mn hnh ng i ca ngi khch (nu c).
V d:
Bai6.inp
Kt qu:
5
1
01000
10111
01010
01101
01010

1->2->3->4->5

Bai6.inp

Kt qu:

6
1
011000
101010
110001
000010
010100
001000

KHONG TON TAI DUONG DI

Bai6.inp

Kt qu:

5
2
01011
10101
01010
10101
11010

2->1->5->4->3

Bin Son: o Anh Pha

Trang 32

Gio Trnh Thc Hnh L Thuyt Th

Bai6.inp

Kt qu:

6
1
011000
101000
110000
000011
000101
000110

KHONG TON TAI DUONG DI

HNG DN THUT TON


S dng k thut tm kim theo chiu su.
HNG DN CI T
S dng k thut ci t tm kim theo phng php quy.
CHNG TRNH MU

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define FileIn "Bai6.inp"
int Dem = 0;
//Dm s ng i
int*L;
//Lu li ng i
char*DanhDau;
//Dnh du nh i
int **A,n,D;
/*Dc file d liu bi ton*/
void Doc_File() {
FILE*f = fopen(FileIn,"rb");
fscanf(f,"%d%d",&n,&D);
cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";
}
cout<<endl;
}
fclose(f);
D--;
}
/*Khi to d liu ban u cho bi ton*/
void KhoiTao() {
Bin Son: o Anh Pha

Trang 33

Gio Trnh Thc Hnh L Thuyt Th


DanhDau = new char [n];
L = new int [n];
for (int i = 0; i<n; i++) {
DanhDau[i] = 0;
L[i] = 0;
}
DanhDau[D] = 1;
L[0] = D;
}
/*In ng i ca bi ton ra mn hnh*/
void InDuongDi(int Dinh) {
Dem++;
cout<<endl<<D+1;
for (int i = 1; i<Dinh; i++)
cout<<" -> "<<L[i]+1;
}
/*Tm kim ng i*/
void TimKiem(int Dinh) {
if(Dinh == n && Dem == 0) InDuongDi(Dinh);
else {
for(int i = 0; i<n; i++)
if( A[L[Dinh-1]][i]>0 && DanhDau[i] == 0 && Dem==0){
L[Dinh] = i;
DanhDau[i] = 1;
TimKiem(Dinh+1); //Tim kim nh k tip
L[Dinh] = 0;
DanhDau[i] = 0;
}
}
}
/*Chng trnh chnh*/
void main() {
clrscr();
Doc_File();
KhoiTao();
cout<<"Duong Di Nguoi Khach";
TimKiem(1);
//Tm kim t nh th 2 ca th
if(Dem==0)
cout<<" Khong Co";
delete*A,DanhDau,L;
getch();
}
Bin Son: o Anh Pha

Trang 34

Gio Trnh Thc Hnh L Thuyt Th

BI TON 7
C n thnh ph bit rng ng i gia cc thnh ph (nu c) l ng i hai
chiu. S mng li giao thng ca n thnh ph cho bi ma trn A[i,j] trong :
- A[i,j] l di ng i t thnh ph i n thnh ph j.
- A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
- A[i,j] = A[j,i]
- A[i,j] nguyn, khng m.
Hy xc nh ng i ngn nht t thnh ph D n thnh ph C.
D liu vo: th lin thng v cho trong file Bai7.inp vi ni dung
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh ng i ngn nht t nh D n C v gi tr ng i
ngn nht tm c.
V d:
Bai7.inp
Kt qu:
6
16
012000
102230
220540
025032
034304
000240

DUONG DI NGAN NHAT LA: 5


1->2->4->6

Bai7.inp
Kt qu:
6

DUONG DI NGAN NHAT LA: 8

16
014000
102650
420730
067001
053003
000130

1->2->4->6

HNG DN THUT TON


S dng thut ton DIJKSTRA tm ng i ngn nht.

Bin Son: o Anh Pha

Trang 35

Gio Trnh Thc Hnh L Thuyt Th

CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <values.h>
#define FileIn "Bai7.inp"
/*c file d liu bi ton*/
void Doc_File(int**A, int &n, int &D, int &C){
FILE*f = fopen(FileIn,"rb");
fscanf(f,"%d%d%d",&n,&D,&C);
cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<" "<<C<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";
}
cout<<endl;
}
fclose(f);
D--; C--;
}
/*Thut ton Dijkstra tm ng i ngn nht t nh D n nh C*/
void Dijkstra(int **A, int n, int D, int C) {
char *DanhDau = new char[n];
int *Nhan = new int[n];
int *Truoc = new int[n];
int XP, min;
for(int i=0; i<n; i++){
Nhan[i] = MAXINT;
DanhDau[i] = 0;
Truoc[i] = D;
}
Bin Son: o Anh Pha

Trang 36

Gio Trnh Thc Hnh L Thuyt Th


Nhan[D] = 0;
DanhDau[D] = 1;
XP = D;
while(XP != C){
for(int j=0; j<n; j++)
if(A[XP][j]>0 && Nhan[j]>A[XP][j]+Nhan[XP] && DanhDau[j]==0) {
Nhan[j] = A[XP][j]+Nhan[XP];
Truoc[j] = XP;
}
min = MAXINT;
for(j = 0; j<n; j++)
if(min>Nhan[j]&& DanhDau[j]==0){
min = Nhan[j] ;
XP = j ;
}
DanhDau[XP] = 1;
}
cout<<Duong Di Ngan Nhat La:<<Nhan[C]<<endl;
cout<<C+1<< <- <<Truoc[C]+1;
i = Truoc[C];
while(i!=D){
i = Truoc[i];
cout<< <- <<i+1;
}
}
/*Chng trnh chnh*/
void main() {
int**A,n,Dau,Cuoi;
Doc_File(A,n,Dau,Cuoi);
Dijkstra(A,n,Dau,Cuoi);
delete*A;
getch();
}

Bin Son: o Anh Pha

Trang 37

Gio Trnh Thc Hnh L Thuyt Th

BI TON 8
Mt cng ty cn thay ton b h thng dy in cho n phng lm vic. Cho bit s
in hin c ca n cn phng ny c biu din bng ma trn A[i,j] trong :
- A[i,j]=A[j,i] chnh l chiu di dy in ni lin gia hai phng i v j.
- A[i,j] = A[j,i] = 0 nu i khng ni lin vi j.
Hy lp trnh tnh di cu dy dn cn s dng sao cho c n phng iu c
in v s lng ny l t nht.
Ch : th cho l lin thng.
D liu vo: cho trong file Bai8.inp ( th cho lin thng).
- Dng u ghi s n l s nh ca mt th (0<n<100)
Dng i+1 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: lu trong file Bai8.out vi ni dung sau:
- Dng u lu di dy dn nh nht
- Cc dng cn li lu ng i cn ni in gia nh i ni vi nh j c
trng s A[i,j] (i -> j = A[i][j]).
-

Bai8.inp

Bai8.out

5
03322
30238
32014
23104
28440

7
43
32
41
15

Bai8.inp

Bai8.out

8
02340000
20304000
33076520
40700030
04600408
00504016
00230105
00008650

20
1-2
1-3
3-7
7-6
7-4
2-5
7-8

HNG DN THUT TON


Thut ton Prim tm cy ph ti tiu.
Thut ton Kruskal tm cy ph ti tiu.
1) Thut ton Prim tm cy ph ti tiu.
Bc 1: Xut pht t nh k bt k (thng thng chon k l nh u tin) chn mt
cnh c trng s nh nht ca th (min{A[k][j]}j=1..n) ta nh du 2 nh i qua cnh
Bin Son: o Anh Pha

Trang 38

Gio Trnh Thc Hnh L Thuyt Th

v s cnh tm c l 1. Chuyn sang bc 2.


Bc 2: Tm cnh nh nht ca th vi iu kin cnh tm c phi c 1 nh
cha nh du v 1 nh nh du (min{A[i][j]}j=1..n, i=1..n sao cho i nh u v j
cha nh du) trnh trng hp to thnh chu trnh. Ta tng s cnh tm c ln
1 v chuyn sang bc 3.
Bc 3: Nu s cnh tm c bng n-1 kt thc thut ton, ngc li quay v bc 2.
2) Thut ton Kruskal tm cy ph ti tiu.
Bc 0: Khi to tp cnh tm c l rng. Chuyn sang bc 1.
Bc 1: Chn mt cnh c trng s nh nht sao cho khi a cnh ny vo tp cnh tm
c khng to thnh chu trnh. Tng s cnh tm c ln 1v chuyn sang bc 2.
Bc 2: Nu s cnh tm c bng n-1 thut ton kt thc, ngc li quay v bc 1.
HNG DN CI T
1) Thut ton Prim tm cy ph ti tiu.
Ta t chc mng 1 chiu D nh du . Nu D[i]=1 nh i c nh du v
D[i]=0 nu i cha c nh du.
Bc 1: Tm min{A[i][j]}j=1..n, i=1..n. Sau gn D[i]=D[j]=1 (nh du 2 nh i,j) v
cho s cnh tm c bng 1 (Dem=1).
Bc 2: Tm min{A[i][j]}j=1..n, i=1..n vi iu kin D[i]=1 v D[j]=0. Sau gn
D[j]=1 (nh du nh j va tm c) v tng s cnh ln 1 (Dem++).
Bc 3: Nu Dem = n-1 th thut ton kt thc.
2) Thut ton Kruskal tm cy ph ti tiu.
Ta t chc mng 1 chiu D nh du . Nu D[i]=T th nh i thuc vo cy th
T, D[i] = 0 th nh i cha thuc vo cy.
Bc 1: Tm min{A[i][j]}j=1..n, i=1..n ngoi tr iu kin D[i]=D[j]0. V khi tha mn
iu kin trn nh i,j thuc vo mt cy do khi ly thm cnh ny chng s to
thnh chu trnh. nh i,j tm c tho mn mt trong cc trng hp sau:
- Nu D[i]=D[j]=0, nh i,j cha thuc vo cy nn khi ly 2 nh ny vo tp
cnh ta cho chng thuc vo 1 cy mi. Ngha l s cy T++ v
D[i]=D[j]=T.
- Nu D[i]=0 v D[j]0, nh i cha thuc vo cy v j thuc vo cy. Ta
ly nh i vo cy tng ng vi cy ca nh j. Ngha l gn D[i]=D[j].
- Nu D[i]0 v D[j]=0, nh j cha thuc vo cy v i thuc vo cy. Ta
ly nh j vo cy tng ng vi cy ca nh i. Ngha l gn D[j]=D[i].
- Nu D[i]D[j] v D[i]0 v D[j]0, nh i thuc vo cy v nh j cng
thuc vo cy nhng cy i v j l 2 cy khc nhau. Ta tin hnh ghp cy
ngha l ghp 2 cy cha i,j thnh 1 cy mi.
Temp = D[i]
for(int i=0 ; i<n ; i++)
Bin Son: o Anh Pha

Trang 39

Gio Trnh Thc Hnh L Thuyt Th

if(D[i]==Temp) D[i]=D[j]
Tng s cnh tm c ln 1 (Dem++).
Bc 2: Nu Dem = n-1 th thut ton kt thc.
Ch : trong qua trnh tm c th to thnh rt nhiu cy nhng kt qu tm c
cui cng l mt cy thng qua qu trnh ghp cy.
CHNG TRNH MU
1) Thut ton Prim tm cy ph ti tiu.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <values.h>
#define FileInt "Bai8.inp"
#define FileOut "Bai8.out"
/*Lu li nhng cnh i qua x->y*/
typedef struct Egde {
int x,y;
};
/*Doc d liu t file*/
void Doc_File(int **A,int &n){
FILE*f = fopen(FileInt,"rb");
fscanf(f,"%d",&n);
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
}
}
fclose(f);
}
/*Ghi d liu ra file*/
void Ghi_File(Egde*L,int n,int Sum) {
FILE*f = fopen(FileOut,"wb");
fprintf(f,"%d\n",Sum);
for(int i =0; i<n-1; i++)
fprintf(f,"%d - %d\n",L[i].x+1,L[i].y+1);
fclose(f);
}
/*Thut ton Prim*/

Bin Son: o Anh Pha

Trang 40

Gio Trnh Thc Hnh L Thuyt Th


void Prim(int **A, int n){
char *D = new char[n];
/*Dnh du nh*/
Egde *L = new Egde[n-1]; /*Lu ng i */
int min = MAXINT, Dem = 0, Sum = 0;
/*Khoi to gi tr cho mng nh du*/
for(int i=0; i<n; i++)
D[i]=0;
/*Tm cnh nh nht u tin xut pht t nh 1*/
for(int j=1; j<n; j++)
if(min>A[0][j] && A[0][j]!=0){
min = A[0][j];
L[0].y = j;
}
L[0].x = 0;
D[0] = D[L[0].y] = 1;
Sum+=min;
Dem++;
/*Thc hin cho n khi s cnh tm c l n-1 cnh*/
do{
min = MAXINT;
for( i=0; i<n; i++)
if(D[i]==1)
for( j=0; j<n; j++)
if(A[i][j]>0 && min>A[i][j] && D[j]==0){
min = A[i][j];
L[Dem].x = i;
L[Dem].y = j;
}
Sum+=min;
D[L[Dem].y] = 1;
Dem++;
} while(Dem<n-1);
Ghi_File(L,n,Sum);
/*Ghi kt qu tm c vo file*/
}
/*Chng trnh chnh*/
void main() {
int **A,n;
Doc_File(A,n);
Prim(A,n);
delete *A;
}

Bin Son: o Anh Pha

Trang 41

Gio Trnh Thc Hnh L Thuyt Th

2) Thut ton Kruskal tm cy ph ti tiu.


void Kruskal(int **A, int n){
char *D = new char[n];
Egde *L = new Egde[n-1];
int min, Dem = 0, Sum = 0, T = 0, Temp;
for(int i=0; i<n; i++)
D[i] = 0;
do{
min = MAXINT;
for( i=0; i<n; i++)
for(int j=0; j<n; j++)
if(A[i][j]>0 && min>A[i][j]&& !(D[i]!=0 && D[i]==D[j])) {
min = A[i][j];
L[Dem].x = i;
L[Dem].y = j;
}
/*To ra cy mi*/
if(D[L[Dem].x] ==0 && D[L[Dem].y] == 0){
T++;
D[L[Dem].x] = D[L[Dem].y] = T;
}
/*a nh tng ng vo cy*/
if(D[L[Dem].x] == 0 && D[L[Dem].y] != 0)
D[L[Dem].x] = D[L[Dem].y];
/*a nh tng ng vo cy*/
if(D[L[Dem].x] != 0 && D[L[Dem].y] == 0)
D[L[Dem].y] = D[L[Dem].x];
/*Ghp 2 cy thnh 1 cy mi*/
if(D[L[Dem].x] != D[L[Dem].y] && D[L[Dem].y]!=0) {
Temp = D[L[Dem].x];
for( i=0; i<n; i++)
if(Temp==D[i])
D[i]=D[L[Dem].y];
}
Sum+=min;
Dem++;
} while(Dem<n-1);
Ghi_File(L,n,Sum);
}

Bin Son: o Anh Pha

Trang 42

Gio Trnh Thc Hnh L Thuyt Th

BI TON 9
C n thnh ph c nh s t 1 n n. Mng li giao thng gia cc thnh ph l
ng hai chiu. Trn ng i (nu c) t thnh ph i n thnh ph j, ngi ta
khng c mang qu A[i,j] n v hng. Nu khng c ng i t thnh ph i n
thnh ph j th xem nh A[i,j] = 0. Cn vn chuyn hng t thnh ph D n thnh
ph C. Hy thit lp k hoch vn chuyn sao cho khi lng hng vn chuyn l
nhiu nht.
D liu vo: th lin thng v cho trong file Bai9.inp vi ni dung
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh k hoch vn chuyn t nh D n C v gi tr ng
i ngn nht tm c.
V d:
Bai9.inp
Kt qu:
6
16
012000
102230
220540
025032
034304
000240

KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 2

1->3->4->6

Bai9.inp
Kt qu:
6
16
014000
102650
420730
067001
053003
000130

Bin Son: o Anh Pha

KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 3

1->3->4->2->5->6

Trang 43

Gio Trnh Thc Hnh L Thuyt Th

HNG DN THUT TON


S dng phng php ti u theo tng nh ging thut ton DIJKSTRA.
HNG DN CI T
Khi to:
-

Mi nhn ban u bng v cng.

Tt c cc nh cha c nh du

Trc mi nh l nh u.

nh du nh xut pht.

Xt nh xut pht l nh XP:


-

Nu A[XP][j]>0, j cha c nh du v Nhan[j] = v cng th:


Nhan[j] = min{Nhan[XP],A[XP][j]}
Truoc[j] = XP

Nu A[XP][j]>0, j cha c nh du, Nhan[j] khc v cng v


min{Nhan[XP],A[XP][j]}>Nhan[j] th:
Nhan[j] = min{Nhan[XP],A[XP][j]}
Trc[j] = XP

Xt nh xut pht tip theo:


nh xut pht tip theo l nh cha c nh du v nhn ca nh phi ln
nht nhng khc v cng. Khi chn c nh xut pht ta phi nh du nh XP.
Minh ha thut ton: Xt th di y, hy lp k hoch vn chuyn hng nhiu
nht t nh 1 n nh 6.

Khi to:
nh

Nhn

nh du 1*

Trc
Bin Son: o Anh Pha

Trang 44

Gio Trnh Thc Hnh L Thuyt Th

Xut pht l nh 1: dnh du nh 1.


nh

Nhn

nh du 1*

Trc
-

Xut pht l nh 3: nh du nh 3 (nh 3 l nh c nhn ln nht khc


v cng v cha c nh du).
nh

Nhn

nh du

1*

Trc

Xut pht l nh 2: nh du nh 2 (nh 2 l nh c nhn ln nht khc


v cng v cha c nh du).
nh

Nhn

nh du

1*

Trc

Xut pht l nh 4: nh du nh 4 (nh 4 l nh c nhn ln nht khc


v cng v cha c nh du).
nh

Nhn

nh du

1*

Trc

Xut pht l nh 5: nh du nh 5 (nh 5 l nh c nhn ln nht khc


v cng v cha c nh du).
nh

Nhn

nh du

1*

Trc

Xut pht l nh 6: nh du nh 6. nh xut pht bng nh i n nn


thut ton kt thc v trng ti ln nht l 2, k hoch vn chuyn qua cc
con ng l: 6 4 3 1.

Bin Son: o Anh Pha

Trang 45

Gio Trnh Thc Hnh L Thuyt Th

CHNG TRNH MU
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <values.h>
#define FileIn "Bai9.inp"
/*Dc file d liu ca bi tan*/
void Doc_File(int**A, int &n, int &D, int &C){
FILE*f = fopen(FileIn,"rb");
fscanf(f,"%d%d%d",&n,&D,&C);
cout<<"Ma Tran Lien Ket Tuong Ung.\n";
cout<<D<<" "<<C<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";
}
cout<<endl;
}
fclose(f);
D--;
C--;
}
/*Th tc tm ng i vn chuyn hng nhiu nht*/
void VanChuyen(int **A, int n, int D, int C) {
char *DanhDau = new char[n];
int *Nhan = new int[n];
int *Truoc = new int[n];
int XP, min,max;
for(int i=0; i<n; i++){
Nhan[i] = MAXINT;
DanhDau[i] = 0;
Truoc[i] = D;
}
DanhDau[D] = 1;
XP = D;
while(XP != C){
for(int j=0; j<n; j++)
if(A[XP][j]>0&&DanhDau[j]==0){

Bin Son: o Anh Pha

Trang 46

Gio Trnh Thc Hnh L Thuyt Th


if(Nhan[j]==MAXINT){
if(Nhan[XP]>A[XP][j])
Nhan[j] = A[XP][j];
else Nhan[j] = Nhan[XP];
Truoc[j] = XP;
}
if(Nhan[j]!=MAXINT){
if(Nhan[XP]>A[XP][j])
min = A[XP][j];
else min = Nhan[XP];
if(Nhan[j]<min){
Nhan[j] = min;
Truoc[j] =XP;
}
}
}
max = 0;
for(j=0; j<n; j++)
if(Nhan[j]<MAXINT&&DanhDau[j]==0&&max<Nhan[j]){
max = Nhan[j];
XP = j;
}
DanhDau[XP] = 1;
}
cout<<"Van chuyen nhieu nhat la: "<<Nhan[C];
cout<<"\nCon duong van chuyen nhu sau:\n";
cout<<C+1<<" <- "<<Truoc[C]+1;
i = Truoc[C];
while(i!=D){
i = Truoc[i];
cout<<" <- "<<i+1;
}
}
/*Chng trnh chnh*/
void main() {
clrscr();
int**A,n,Dau,Cuoi;
Doc_File(A,n,Dau,Cuoi);
VanChuyen(A,n,Dau,Cuoi);
delete*A;
getch();
}
Bin Son: o Anh Pha

Trang 47

Gio Trnh Thc Hnh L Thuyt Th

BI TON 10
C n thnh ph bit rng ng i gia cc thnh ph l ng i hai chiu. S
mng li giao thng ca n thnh ph cho bi ma trn A[i,j] trong :
- A[i,j] l di ng i t thnh ph i n thnh ph j.
- A[i,j] = 0 nu khng c ng i t thnh ph i n thnh ph j.
- A[i,j] = A[j,i]
- A[i,j] nguyn, khng m.
Hy xc nh ng i di nht t thnh ph D n thnh ph C vi iu kin thnh
ph qua khng c i li.
D liu vo: th lin thng v cho trong file Bai10.inp
- Dng u ghi s n l s nh ca mt th (0<n<100)
- Dng th hai lu nh D v nh C.
- Dng i+2 (1 i n ) cha n s A[i,1],A[i,2]A[i,n] mi s cch nhau bi
mt khong trng.
D liu ra: xut ra mn hnh ng i di nht t nh D n C v gi tr ng i
ngn nht tm c.
V d:
Bai10.inp
6
16
012000
102230
220540
025032
034304
000240

Kt qu:
DUONG DI DAI NHAT LA: 16
1->2->4->3->5->6

Bai10.inp
6
16
014000
102650
420730
067001
053003
000130

Kt qu:
DUONG DI DAI NHAT LA: 25
1->3->4->2->5->6

HNG DN THUT TON


S dng k thut tm kim theo chiu su.

Bin Son: o Anh Pha

Trang 48

Gio Trnh Thc Hnh L Thuyt Th

HNG DN CI T
S dng k thut ci t tm kim theo phng php quy, khi tm c 1
phng n th lu li trng thi ca phng n ban u v so snh vi phng n
mi tm c, nu phng n mi tt hn th chn phng n mi.
CHNG TRNH MU
include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define Filename "Bai10.inp"
/*Khai bo cc bin ton cc*/
int*L,*L1;
//Luu lai duong da di
char*DanhDau;
//Danh dau dinh da di
int **A,n,D,C,Tong,Tong1,Canh1;
/*Dc file d liu ca bi ton*/
void Doc_File() {
FILE*f = fopen(Filename,"rb");
fscanf(f,"%d%d%d",&n,&D,&C);
cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<" "<<C<<endl;
*A = new int [n];
for(int i =0;i<n;i++) {
A[i] = new int [n];
for(int j =0;j<n;j++) {
fscanf(f,"%d",&A[i][j]);
cout<<A[i][j]<<" ";
}
cout<<endl;
}
fclose(f);
D--; C--;
}
/*Khi to ban u cho th tc tm kim*/
void KhoiTao() {
DanhDau = new char [n];
L = new int [n];
//Lu ng i tm c
L1 = new int [n];
//Lu ng i ln nht
for (int i = 0; i<n; i++) {
DanhDau[i] = 0;
//Cc nh cha c nh du
L[i] = 0;
}
DanhDau[D] = 1;
//Dnh du nh xut pht
L[0] = D;
//ng i u tin qua nh u
Bin Son: o Anh Pha

Trang 49

Gio Trnh Thc Hnh L Thuyt Th


Tong = 0;
Tong1 = 0;

//Trong s ng i
//Lu li trng s ln nht ca ng i

}
/*In ng i di nht tm c*/
void InDuongDi() {
cout<<"\nDUONG DI DAI NHAT:"<<Tong1<<endl<<D+1;
for (int i = 1; i<Canh1; i++)
cout<<" -> "<<L1[i]+1;
}
/*X l ly phng n tt hn*/
void XuLy(int Canh) {
if(Tong>Tong1){
Tong1 = Tong;
//Lu li trng s tt hn
Canh1 = Canh;
//Lu li s cnh i qua
for(int i =0; i<Canh; i++)
L1[i] = L[i];
//Lu li ng i tt hn
}
}
/*Th tc tm kim quy*/
void TimKiem(int SoCanh) {
if(L[SoCanh-1] == C) XuLy(SoCanh);
else { for(int i = 0; i<n; i++)
if( A[L[SoCanh-1]][i]>0 && DanhDau[i] == 0){
L[SoCanh] = i;
DanhDau[i] = 1;
Tong+=A[L[SoCanh-1]][i];
TimKiem(SoCanh+1);
L[SoCanh] = 0;
Tong-=A[L[SoCanh-1]][i];
DanhDau[i] = 0;
}
}
}
void main() {
Doc_File();
KhoiTao();
TimKiem(1);
if(Tong1==0) cout<<"\NKHONG CO DUONG DI";
else InDuongDi();
delete*A,DanhDau,L;
getch();
}
Bin Son: o Anh Pha

Trang 50

Gio Trnh Thc Hnh L Thuyt Th

THUT TON
[] Kim tra tnh lin thng ca th ..............................................................................
[] m s thnh phn lin thng ca th ....................................................................
[] Thut ton tm mi ng i t nh D n nh C ....................................................
[] Thut ton tm mt ng i Euler..............................................................................
[] Thut ton tm mt ng i Hamilton .......................................................................
[] Thut ton Dijkstra tm ng i ngn nht................................................................
[] Thut ton Prim tm cy ph ti tiu ...........................................................................
[] Thut ton Kruskal tm cy ph ti tiu ......................................................................
[] Thut ton quy tm mi ng i Euler..................................................................
[] Thut ton quy tm mi ng i Hamilton ...........................................................
[] Thut ton ton kh quy tm mi ng i Euler...................................................
[] Thut ton ton kh quy tm mi ng i Hamilton ............................................

Bin Son: o Anh Pha

Trang 51

You might also like