Professional Documents
Culture Documents
CMP 3014
CMP 3014
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 5: .
.
III
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
}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.
{
printf("Khong mo duoc file\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
}
Ki
KiemTraMaTranHopLe
int KiemTraMaTranKeHopLe(DOTHI g)
{
int i;
for (i=0; i<g.n; i++)
{
8 BÀI 1:
return 0;
}
return 1;
}
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();
}
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
Chú ý
BÀI 1: 15
}
}
}
void XetLienThong(DOTHI g)
{
g
int i;
for (i=0;i<g.n;i++) à0
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)
{
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.
-
thông).
-
BÀI 2: 19
Hình 2.2:
cho dù
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.
};
return; //thoát k
}
}
}
24 BÀI 2:
int i,j;
DOTHI temp = g; //
/* B
(s
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 i,j;
có
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))
{
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.
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)
- 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;
trình d
}
}
voi
S
{
int i;
BÀI 3: 37
F*/
void main()
{
DOTHI g;
clrscr();
if (DocMaTranKe(inputfile, g) == 1)
{
XuatMaTranKe(g);
printf("Bam 1 phim bat ki de bat dau duyet theo DFS ...\n\n");
getch();
duyettheoDFS(0,2,g);
}
getch();
}
- .
- 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
{
};
re
}
46 BÀI 3:
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:
{
QUEUE Q;
có gì
BÀI 3: 47
trình bày
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*/
}
}
BÀI 4: 49
BÀI 4: T
4.1 G
có
X
c
X\Y và v Y, ta
Chú ý:
Hình 4.1: T
BÀI 4: 51
52 BÀI 4:
Chú ý:
ó liên thông
int XetLienThong(DOTHI g)
return SoThanhPhanLT;
Prim
int u;
int v;
int value;
}CANH;
{
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;
if (ChuaXet[i] == 1) // xe
C
CanhNhoNhat
CanhNhoNhat.v = j;
CanhNhoNhat.value = g.a[i][j];
TongTrongSoCuaCayKhung += T[i].value;
}
56 BÀI 4:
{e}.
-
BÀI 4: 57
Hình 4.2:
58 BÀI 4:
BÀI 4: 59
60 BÀI 4:
khung n
{
int u;
int v;
int value;
}CANH;
CANH canhtam;
for(int i = 0 ; i < tongsocanh - 1 ; i++)
{
{
62 BÀI 4:
canhtam = E[i];
E[i] = E[j];
E[j] = canhtam;
}
}
}
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);
if (nhan[listEdge[canhdangxet].u] != nhan[listEdge[canhdangxet].v])
{
T[nT] = listEdge[canhdangxet];
nT++;
}
if(nT != g.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
sau:
F.
ChuaXet[i] = 0; i X
LuuVet[i] = -1; i X
DoDaiDuongDiToi[S] = 0
DoDaiDuongDiToi[i] = + , i X\{S}
k X
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.
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;
}
}
{
DoDaiDuongDiToi[v] = DoDaiDuongDiToi[u] + g.a[u][v];
72 BÀI 5:
LuuVet[v] = u;
}
}
}
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);
}
}
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:
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).
int L[MAX][MAX];
void Floyd(DOTHI g)
{
int i,j;
là j.
80 BÀI 5:
}
else
{
Sau_Nut[i][j] = - tìm
-1.
}
}
}
{
L[i][j] = L
}
}
}
}
BÀI 5: 81
--> F
int S,F;
printf ("nhap vao dinh bat dau: ");
scanf("%d",&S);
if (Sau_Nut[S][F] == - -
-
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. .
5. , Khoa CNTT
TP.HCM.