You are on page 1of 88

T

Biên

www.hutech.edu.vn
*1.2018.CMP3014*
- :
tailieuhoctap@hutech.edu.vn
I

.................................................................................................................. I
............................................................................................................ II
............................................ 1
1.1 ............................................................................................................... 1
1.2 PHÂN ............................................................................................. 2
1.3 MA ....................................................................................................... 2
1.4 MA FILE ........................................................................ 4
1.5 LIÊN THÔNG ........................................................................................... 9
1.6 TÌM CÁC THÀNH LIÊN THÔNG ...................... 11
1.7 TÌM LIÊN THÔNG .............................................................. 14
BÀI 2: NH EULER ................................................................... 17
2.1 ........................................................................................ 17
2.2 TH TOÁN FLEURY........................................................................................ 18
2.3 TOÁN TÌM CHU TRÌNH VÀ EULER .......................................... 19
2.4 TÌM CHU TRÌNH EULER ................................................................. 22
2.5 TÌM ............................................................................. 25
.......... 28
3.1 CÁC KHÁI ................................................................................................ 28
3.2 TOÁN TÌM THEO SÂU DFS_DEPTH FIRST SEARCH ............... 29
3.3 TÌM PHÁP SÂU (DFS) ... 35
3.4 TOÁN TÌM THEO BFS (BREADTH FIRST SEARCH) ...... 38
3.5 TÌM (BFS) ........................ 44
BÀI 4: ........................................................................... 49
4.1 CÂY KHUN G ................................................................................. 49
4.2 TOÁN PRIM ........................................................................................... 49
4.3 THI HÀNH TOÁN PRIM ....................................................... 52
4.4 TOÁN KRUSKAL ..................................................................................... 56
4.5 SO SÁNH KHÁC KRUSKAL PRIM ........................................... 60
4.6 THI HÀNH TOÁN KRUSKAL ................................................ 61
BÀI 5: ............................................... 64
5.1 ...................................................................................................... 64
5.2 TOÁN DIJKSTRA .................................................................................... 65
5.3 THI HÀNH TÌM DIJKSTRA .............. 70
5.4 TOÁN FLOYD ......................................................................................... 73
5.5 G THI HÀNH TÌM TOÁN FLOYD ........ 79
TÀI THAM ............................................................................................. 82
II

- Bài 2:

- Bài 3:

- Bài 4: Tìm cây khung/cây bao trùm n

- Bài 5: .

.
III

- = 5 ánh giá quá trình + 5


hành.
BÀI 1: 1

BÀI 1:

1.1 TH

Vòng/khuyên.

sau
2 BÀI 1:

Hình 1.1:

Hình 1.2:

1.2 PHÂN LO TH

1.3 MA TR N K
BÀI 1: 3

có:
là 4 i = 0, j = 1 và a[i,j] = a[0,1] = 4. trong
i = 0, j = 2, và a[i,j] = a[0,2]
là 4 i = 1, j = 0 và a[i,j] = a[1,0] = 4. = 3.

i = 2, j = 0 và a[i,j] =
a[2,0] = 0.
4 BÀI 1:

-
a[i,i] = 0.

-
a[j,i].

1.4 NH P XU T MA TR N K T FILE

-
BÀI 1: 5

#define inputfile

typedef struct GRAPH {

}DOTHI;

h:

DOTHI g;

g.
g.

g.n

g.a[i][j]

h = g.n;

k = g.a[0][0];
6 BÀI 1:

C.

int DocMaTranKe(char TenFile[100], DOTHI &g)


{
FILE* f;
f = fopen(Ten

{
printf("Khong mo duoc file\n");

fscanf(f, "%d", &g.n);

int i, j;
for (i=0; i<g.n; i++)
BÀI 1: 7
{
for (j=0; j<g.n; j++)
{

}
}

fclose(f);

xong
}

void XuatMaTranKe (DOTHI g)


{
printf("So dinh cua do thi la %d\n", g.n);
printf("Ma tran ke cua do thi la\n");
for (int i = 0; i < g.n; i++)
{
printf ("\t");
for (int j = 0; j < g.n; j++)
{
printf("%d ",g.a[i][j]);
}
printf("\n");
}
}

Ki

KiemTraMaTranHopLe

int KiemTraMaTranKeHopLe(DOTHI g)
{
int i;
for (i=0; i<g.n; i++)
{
8 BÀI 1:

return 0;
}
return 1;
}

dùng hàm sau KiemTraDoThiVoHuong sau.

int KiemTraDoThiVoHuong(DOTHI g)
{
int i, j;
for (i=0; i<g.n; i++)
{
for (j=0; j<g.n; j++)
{

return 0;
}
}

void main()
{
DOTHI g;
clrscr();
if (DocMaTranKe(inputfile, g) == 1)
{
printf("Da lay thong tin do thi tu file thanh cong.\n\n");
XuatMaTranKe(g);
printf("Bam 1 phim bat ki de tien hanh kiem tra do thi ...\n\n");
getch();
BÀI 1: 9
if (KiemTraMaTranKeHopLe(g) == 1)
printf ("Do thi hop le.\n");
else
printf ("Do thi khong hop le.\n");

if (KiemTraDoThiVoHuong(g) == 1)
printf ("Do thi vo huong.\n");
else
printf ("Do thi co huong.\n");
}
getch();
}

1.5 TH LIÊN THÔNG

Hình 1.3:
10 BÀI 1:

1 3 3 1 2).

thông con.

Hình 1.4:

nh 5.

-
BÀI 1: 11
1.6 THU T GI I N LIÊN
THÔNG C TH

Nhan[i] = 0 và SoThanhPhanLT = 0.

SoThanhPhanLT.

Hình 1.5:

1
12 BÀI 1:

5
BÀI 1: 13
6

8
14 BÀI 1:

10

1.7 NG D TH LIÊN THÔNG

Chú ý
BÀI 1: 15

void DiTimCacDinhLienThong (DOTHI g, int nhan[MAX], int i)


{
for (int j = 0; j < g.n; j++)
{

}
}
}

void XetLienThong(DOTHI g)
{

g
int i;
for (i=0;i<g.n;i++) à0
Nhan[i] =0;

for (i=0; i<g.n; i++)


{
if (Nhan[i] == 0)
{

SoThanhPhanLT
16 BÀI 1:

}
}
printf ("So thanh phan lien thong la %d\n",SoThanhPhanLT);

*/
for (i = 1; i <= SoThanhPhanLT; i++)
{
printf("Thanh phan lien thong thu %d gom cac dinh ", i);

liên thông
printf("\n");
}
}

void main()
{

DOTHI g;
clrscr();

if (DocMaTranKe("C:\\test2.txt",g) == 1)
{

printf("Da lay thong tin do thi tu file thanh cong.\n\n");


XuatMaTranKe(g);
printf("Bam 1 phim bat ki de bat dau xet tinh lien thong cua do thi ...\n\n");

getch();
XetLienThong(g);

}
getch();

}
BÀI 2: 17

BÀI 2:
EULER

2.1 M T S

Hình 2. 1
2 3 4 5 2 4 6 5 3 1.

4 5 2 3 4 2 1 3 5.
18 BÀI 2: HU TRÌNH EULER

- nhau.

Euler.

chu trình Euler:

2.2 THU T TOÁN FLEURY

-
thông).

-
BÀI 2: 19

Hình 2.2:

cho dù

2.3 THU T TOÁN


20 BÀI 2:

Find_tour (u)

Find_tour (v).
BÀI 2: 21
22 BÀI 2:

trình Euler là 1 2 4 5 7 8 6 4 3 1.

Tiêu chí Chu trình Euler


Có Có
Có Có

2.4 NG D N TÌM CHU TRÌNH EULER


V
BÀI 2: 23
struct STACK
{

};

void khoitaoStack (STACK &stack)


{

void DayGiaTriVaoStack (STACK &stack, int value)


{

if(stack.size + 1 >= 100)

return; //thoát k

void TimDuongDi (int i, DOTHI &g, STACK & stack)


{
for (int j = 0; j < g.n; j++)
{

}
}

}
24 BÀI 2:

int KiemTraChuTrinhEuler (DOTHI g)


{

int i,j;

DOTHI temp = g; //

/* B

(s

printf("\n Chu Trinh Euler : ");

return 1

}
BÀI 2: 25

void main()
{
DOTHI g;
clrscr();
if (DocMaTranKe(inputfile, g) == 1)
{
printf("Da lay thong tin do thi tu file thanh cong.\n\n");
XuatMaTranKe(g);
printf("Bam 1 phim bat ki de bat dau xet tim chu trinh euler ...\n\n");
getch();
if (!KiemTraChuTrinhEuler(g))
{
printf("Khong co chu trinh Euler trong do thi cua ban\n");
getch();
}
}
getch();
}

2.5 NG D N

int KiemTraDuongDiEuler (DOTHI g)

{
int i,j;


26 BÀI 2:

DOTHI temp = g; //

/* B

printf("\

return 1;

void main()
{

DOTHI g;
clrscr();

if (DocMaTranKe(inputfile, g) == 1)
{
BÀI 2: 27
printf("Da lay thong tin do thi tu file thanh cong.\n\n");

XuatMaTranKe(g);
printf("Bam 1 phim bat ki de bat dau xet tim chu trinh euler ...\n\n");
getch();

if (!KiemTraChuTrinhEuler(g))
{

printf("Khong co chu trinh Euler trong do thi cua ban\n");


printf("Bam 1 phim bat ki de bat dau xet tim duong di euler ...\n\n");

getch();
if (!KiemTraDuongDiEuler(g))
{
printf("Khong co duong di Euler trong do thi cua ban \n");
}

}
}

getch();
}
28 BÀI 3:

BÀI 3:

- u.

3.1 CÁC KHÁI NI M

0,x 1,x2 k i,xi+1)

0, x1), (x1 , x2
(xk-1, xk = v).

chu trình
.

Hình 3.1:
BÀI 3: 29

mà yêu

âu
(DFS_Depth First Search) và
(BFS_Breath First Search)

3.2 THU T TOÁN TÌM KI M THEO CHI U SÂU


DFS_DEPTH FIRST SEARCH

- gán

LuuVet[i] = - có
-1.

-
30 BÀI 3:

o
ChuaXet[u]=-1.

F. Thông
F.

au

Hình 3.2:
BÀI 3: 31

2
32 BÀI 3:

5
BÀI 3: 33
6

7
34 BÀI 3:

10
BÀI 3: 35

theo DFS.

theo DFS.

4 là 4 3 1.

2 và 1 3.

3.3 H NG D N TÌM KI NG
T THEO CHI U SÂU (DFS)

(Finish).

F.
36 BÀI 3:

int u;

for(u = 0; u < g.n ; u++)


{

trình d

}
}

voi
S

{
int i;
BÀI 3: 37

printf("Duong di tu dinh %d den dinh %d la: \n\t",S,F);


i = F;
printf("%d ", F);

F*/

F. Thông báo không


F
{

printf("Khong co duong di tu dinh %d den dinh %d \n",S,F);


}

void main()

{
DOTHI g;
clrscr();

if (DocMaTranKe(inputfile, g) == 1)
{

printf("Da lay thong tin do thi tu file thanh cong.\n\n");


38 BÀI 3:

XuatMaTranKe(g);
printf("Bam 1 phim bat ki de bat dau duyet theo DFS ...\n\n");

getch();
duyettheoDFS(0,2,g);

}
getch();
}

3.4 THU T TOÁN TÌM KI M THEO CHI U R NG


BFS (BREADTH FIRST SEARCH)

- .

- Gán

LuuVet[i] = -
-1.

KhoiTaoQueue.

DayGiaTriVaoQueue.

LayGiaTriRaKhoiQueue.

KiemTraQueueRong.

có gì.
BÀI 3: 39

o ChuaXet[v] =

ChuaXet[u] = -1.

F. Thông
F.

Hình 3.3:
40 BÀI 3:

2
BÀI 3: 41
3
42 BÀI 3:

5
BÀI 3: 43
6

8
44 BÀI 3:

- 4 là 4 3 1.

- 2 và 1 3.

3.5 H NG D N TÌM KI NG
T THEO CHI U R NG (BFS)

(Finish).

1 c
F.
BÀI 3: 45
i

struct QUEUE
{

};

void KhoiTaoQueue(QUEUE &Q)


{

int DayGiaTriVaoQueue(QUEUE &Q,int value)


{
if(Q.size + 1 >= 100)

re

}
46 BÀI 3:

int LayGiaTriRaKhoiQueue(QUEUE &Q,int &value)


{

for(int i = 0; i< Q.size - 1 ;

Q.array[i] = Q.array[i+1];
Q.size--

i thành công.
}

sau:

int KiemTraQueueRong(QUEUE Q)
{

0
return 1;
return 0;

BFS sau:

void BFS(int v, GRAPH g)

{
QUEUE Q;

có gì
BÀI 3: 47

trình bày

for(int u = 0; u < g.n ; u++)

0) và

if (LuuVet[u] == -1)

}
}

{
48 BÀI 3:

toán BFS

{
printf("Duong di tu dinh %d den dinh %d la: \n\t",S,F);

i = F;
printf("%d ", F);

F*/
}

F. Thông báo không


F
{

printf("Khong co duong di tu dinh %d den dinh %d \n",S,F);


}

}
BÀI 4: 49

BÀI 4: T

4.1 G

4.2 THU T TOÁN PRIM

X
c

X\Y và v Y, ta

Gán Y:=Y {w} và T:=T {e}. Ghi chú phép


50 BÀI 4:

Chú ý:

Hình 4.1: T
BÀI 4: 51
52 BÀI 4:

Chú ý:

4.3 NG D N THI HÀNH THU T TOÁN PRIM


V
BÀI 4: 53

ó liên thông

xét tính liên thông

int XetLienThong(DOTHI g)

return SoThanhPhanLT;

Prim

int ChuaXet[MAX]; // giá

int u;

int v;

int value;

}CANH;

void Prim (DOTHI g)

{
54 BÀI 4:

printf ("Do thi khong lien thong, do do khong thuc hien duoc thuat toan
Prim tim cay khung nho nhat\n");

return;

ChuaXet[i] = 0;

while (nT < g.n - -

if (ChuaXet[i] == 1) // xe

for (int j = 0; j < g.n; j++)


BÀI 4: 55
if (ChuaXet[j] == 0 && g.a[i][j] != 0 && GiaTriNhoNhat >

C
CanhNhoNhat

CanhNhoNhat.v = j;

CanhNhoNhat.value = g.a[i][j];

printf ("Cay khung nho nhat cua do thi la \n");

for (i = 0; i < nT - 1; i++)

printf ("(%d,%d), ", T[i].u, T[i].v);

TongTrongSoCuaCayKhung += T[i].value;

}
56 BÀI 4:

printf ("(%d,%d).\n", T[nT - 1].u, T[nT - 1].v);

TongTrongSoCuaCayKhung += T[nT - 1].value;

printf ("Tong gia tri cua cay khung la %d\n",TongTrongSoCuaCayKhung);

4.4 THU T TOÁN KRUSKAL


c dùng

{e}.

-
BÀI 4: 57

Hình 4.2:
58 BÀI 4:
BÀI 4: 59
60 BÀI 4:

4.5 SO SÁNH S KHÁC BI T GI A KRUSKAL V I


PRIM
BÀI 4: 61

vào cây khung.

4.6 H NG D N THI HÀNH THU T TOÁN KRUSKAL


H

khung n

không liên thông.

{
int u;
int v;

int value;
}CANH;

void SapXepTang(CANH E[100],int tongsocanh)


{

CANH canhtam;
for(int i = 0 ; i < tongsocanh - 1 ; i++)
{

for(int j = i + 1 ; j < tongsocanh ; j++)


if(E[i].value > E[j].value)

{
62 BÀI 4:

canhtam = E[i];
E[i] = E[j];

E[j] = canhtam;
}

}
}

void Kruskal (DOTHI g)


{
CANH listEdge[MAX]; //

int i,j;
vào listEdge
{
for( j = i+1 ; j< g.n ; j++)
if(g.a[i][j] > 0)
{
listEdge[tongsocanh].u = i;
listEdge[tongsocanh].v = j;
listEdge[tongsocanh].value = g.a[i][j];
tongsocanh++;
}
}

SapXepTang(listEdge, tongsocanh);

for (i = 0; i < g.n ; i++)


nhan[i] = i;
danh
sách listEdge
while(nT < g.n && canhdangxet < tongsocanh)
{
BÀI 4: 63

if (nhan[listEdge[canhdangxet].u] != nhan[listEdge[canhdangxet].v])
{
T[nT] = listEdge[canhdangxet];
nT++;

int giatri = nhan[listEdge[canhdangxet].v];


for (j = 0; j < g.n; j++)
if (nhan[j] == giatri)
nhan[j] = nhan[listEdge[canhdangxet].u];
}

}
if(nT != g.n - -

printf("\nDo thi khong lien thong \n");

{
int TongTrongSoCuaCayKhung = 0;
printf("\nDo thi lien thong \n");
printf ("Cay khung nho nhat cua do thi la \n");
for (i = 0; i < nT; i++)
{
printf ("(%d,%d), ", T[i].u, T[i].v);
TongTrongSoCuaCayKhung += T[i].value;
}
printf ("\nTong gia tri cua cay khung la %d\n",TongTrongSoCuaCayKhung);
}
}
64 BÀI 5:

BÀI 5:

-
Floyd.

5.1 GI I THI U

phí), v.v...

Tro
BÀI 5: 65

5.2 THU T TOÁN DIJKSTRA

sau:

F.

ChuaXet[i] = 0; i X

LuuVet[i] = -1; i X

DoDaiDuongDiToi[S] = 0

DoDaiDuongDiToi[i] = + , i X\{S}

k X

> DoDaiDuongDiToi[v] + e(v,k) thì


66 BÀI 5:

DoDaiDuongDiToi[k] = DoDaiDuongDiToi[v] + e(v,k);

LuuVet[k] = v;

Chú ý:

Hình 5.1:
BÀI 5: 67
68 BÀI 5:
BÀI 5: 69
70 BÀI 5:

5.3 NG D N
NH T V I THU T TOÁN DIJKSTRA

(Finish).

DoDaiDuo F.

#define VOCUC 1000

i
BÀI 5: 71

int TimDuongDiNhoNhat(DOTHI g)
{
int li = - -1
float p = VOCUC;
for(int i = 0 ; i< g.n ; i++)
{
if(ChuaXet[i] == 0 && DoDaiDuongDiToi[i] < p)
{
p = DoDaiDuongDiToi[i];
li = i;
}
}

void CapNhatDuongDi(int u, DOTHI g)


{

for(int v = 0; v < g.n ; v++)


{

{
DoDaiDuongDiToi[v] = DoDaiDuongDiToi[u] + g.a[u][v];
72 BÀI 5:

LuuVet[v] = u;
}
}
}

void Dijkstra (int S, int F, DOTHI g)


{

int i;
for (i = 0; i< g.n ; i++)
{
ChuaXet[i] = 0;
DoDaiDuongDiToi[i] = VOCUC;
LuuVet[i] = -1;
}
DoDaiDuongDiToi[S] = 0;

{
int u = TimDuongDiNhoNhat(g

if(u == -

CapNhatDuongDi(u,g);
}

{
printf("Duong di ngan nhat tu dinh %d den dinh %d la: \n\t",S,F);
i = F;
printf("%d ", F);
while (LuuVet[i] != S)
BÀI 5: 73
{
printf ("<-%d", LuuVet[i]);
i = LuuVet[i];
}
printf ("<-%d\n", LuuVet[i]);
printf("\tVoi do dai la %d\n",DoDaiDuongDiToi[F]);
}
F
{
printf("Khong co duong di tu dinh %d den dinh %d \n",S,F);
}
}

5.4 THU T TOÁN FLOYD

sau:

u,v X

L[u,v] = e(u,v).

Sau_Nut[u,v] = v;

L[u,v] = +

Sau_Nut[u,v] = -1;
74 BÀI 5:

L[i,j] > L[i,k] + L[k,j]

L[i,j] = L[i,k] + L[k,j]

Sau_Nut[i,j] = Sau_Nut[i,k]

Chú ý:

- k và
k j.

- Khi + -

Hình 5.2:
BÀI 5: 75
76 BÀI 5:
BÀI 5: 77
78 BÀI 5:
BÀI 5: 79
5.5 NG D N THI HÀNH TÌM KI
NG N NH T V I THU T TOÁN FLOYD

(Finish).

#define VOCUC 1000

int L[MAX][MAX];

void Floyd(DOTHI g)

{
int i,j;

for(i = 0; i< g.n ; i++)


{

for( j = 0; j < g.n ; j++)


{

là j.
80 BÀI 5:

}
else

{
Sau_Nut[i][j] = - tìm
-1.

}
}
}

for(int k = 0; k< g.n ; k++)


{

for(i = 0 ; i < g.n ; i++)


{

for(j = 0; j< g.n ; j++)


{

{
L[i][j] = L

}
}

}
}
BÀI 5: 81
--> F

int S,F;
printf ("nhap vao dinh bat dau: ");
scanf("%d",&S);

printf("Nhap vao dinh ket thuc: ");


scanf("%d",&F);

if (Sau_Nut[S][F] == - -
-

printf ("Khong co duong di tu dinh %d den dinh %d la :\n",S,F);


}

printf ("Duong di ngan nhat tu dinh %d den dinh %d la :\n",S,F);


printf ("\t%d",S);

int u = S;

u = Sau_Nut[u][F];
printf (" --> %d",u);

}
printf (" --> %d",F);
printf ("\n\tVoi tong trong so la %d",L[S][F]);

}
}
82

1. .

2. Reinhard Diestel (2000). Graph Theory. Second Edition. Springer-Verlag New


York.

3. Robert Sedgewick (1995). .

4. L. Lovász and K. Vesztergombi (1999). Discrete Mathematics. Lecture notes. Yale


University. Spring.

5. , Khoa CNTT
TP.HCM.

You might also like