27
TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN BẢN BÁO CÁO THỰC HÀNH TOÁN RỜI RẠC Giáo viên hướng dẫn : Thầy Nguyễn Văn Nguyên Nhóm : 14 Lớp : 11TCLC

Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Embed Size (px)

Citation preview

Page 1: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

TRƯỜNG ĐẠI HỌC BÁCH KHOA ĐÀ NẴNG

KHOA CÔNG NGHỆ THÔNG TIN

BẢN BÁO CÁO

THỰC HÀNH TOÁN RỜI RẠC

Giáo viên h ng d n :ướ ẫ Th y Nguy n Văn Nguyênầ ễNhóm : 14L pớ : 11TCLCSinh viên th c hi n :ự ệ Nguy n Văn Thu nễ ậ

Đà Nẵng – Tháng 12/2012

Page 2: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

SV: NGUYỄN VĂN THUẬN LỚP: 11TCLC

KHOA CÔNG NGHỆ THÔNG TIN – ĐHBKĐN

BÁO CÁO THỰC HÀNH

TOÁN RỜI RẠC

M C L CỤ ỤL I NÓI Đ U . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Ờ ẦPh n 1: Đ BÀI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3ầ ỀPh n 2: BÀI GI I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4ầ Ả

Bài 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Bài 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Bài 1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Câu a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Câu b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Câu c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Bài 1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Bài 1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Bài 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 1

Page 3: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

LỜI NÓI ĐẦU

Ngày nay, Công nghệ thông tin là một trong những ngành đang phát triển rất mạnh mẽ và có ảnh hưởng sâu rộng đến mọi mặt đời sống. Nó là nền tảng của nền kinh tế tri thức, là thước đo trình độ phát triển của một quốc gia.Vì vậy, việc đào tạo đội ngũ kỹ sư công nghệ thông tin có chất lượng đòi hỏi phải được chú trọng và đầu tư đúng mức.

Đại học là môi trường cơ bản cung cấp kiến thức chuyên môn, giúp sinh viên hình thành và phát triển những kĩ năng cần thiết cho công việc. Vì vậy, học đi đôi với hành luôn là phương châm đào tạo hàng đầu trong các trường đại học hiện nay.

Cùng với học phần lý thuyết, học phần Thực Hành Toán Rời Rạc giúp nâng cao khả năng tư duy của sinh viên. Trên cơ sở đề bài thực hành được nhận, sinh viên phải biết cách phân tích và cài đặt để giải quyết các bài toán liệt kê, lập lịch, … nhằm giải quyết những bài toán có tính ứng dụng thực tế cao.

Em xin chân thành cảm ơn giáo viên hướng dẫn – thầy Nguyễn Văn Nguyên đã giúp đỡ và chỉ dẫn em hoàn thành bài báo cáo này.

Đà Nẵng, ngày 20 tháng 12 năm 2012

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 2

Page 4: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

Phần 1:

Đ BÀIỀ

Bài tập 1. Bài toán đếm-Bài toán liệt kê

1. Đ m s xâu nh phân đ dài n:ế ố ị ộa) B t kỳ.ấb) Không có hai bit 0 k nhau.ềc) Có ít nh t hai bit 0 k nhau.ấ ề

2. Vi t ch ng trình li t kê t t c các xâu nh phân đ dài n nh yêu c u c a ế ươ ệ ấ ả ị ộ ư ầ ủbài toán 1. Li t kê có s th t đ ki m tra k t qu đã đ m đ c. Th nh p ệ ố ứ ự ể ể ế ả ế ượ ử ậv i nhi u giá tr khác nhau c a n. L u ý các tr ng h p n=1 và n=2.ớ ề ị ủ ư ườ ợ

3. Vi t ch ng trình nh p m t xâu ch g m ế ươ ậ ộ ữ ồ n ch cái hoa (A...Z)-trong đó có ữm t s ch cái l p. Li t kê t t c các cách s p x p n ch cái này. Có đ m ộ ố ữ ặ ệ ấ ả ắ ế ữ ết ng s cách s p x p.ổ ố ắ ế

4. Xét ph ng trình nguyên: xươ 1+x2+...+xn=k v i xớ i≥0 i=1...k. Vi t ch ng trình ế ươnh p n, k và in ra t t c các nghi m c a ph ng trình.Có đ m t ng s ậ ấ ả ệ ủ ươ ế ổ ốnghi m.ệ

Bài tập 2. Bài toán trên đồ thị

Vi t ch ng trình phát sinh ng u nhiên ma tr n tr ng s Aế ươ ẫ ậ ọ ố nxn= (aij) nxn c a ủđ th vô h ng liên thông G g m ồ ị ướ ồ n đ nh (aỉ ij=aji i, j=1... n). 1. Ki m tra đ th G có ph i là đ th Euler hay không.ể ồ ị ả ồ ị2. Nh p hai đ nh x, y và dùng thu t toán Dijkstra đ tìm đ ng đi ng n ậ ỉ ậ ể ườ ắnh t t x đ n y. ấ ừ ế3. Dùng thu t toán Prim đ tìm cây ph nh nh t c a đ th G.ậ ể ủ ỏ ấ ủ ồ ị

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 3

Page 5: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

Phần 2:

BÀI GI IẢ

Bài tập 1. Bài toán đếm-Bài toán liệt kê Bài 1.1 Số xâu nhị phân độ dài n

THUẬT TOÁNa. Bất kì: 2n

b. Không có hai bit 0 kề nhauo Nếu n = 1: có 2 xâu (S1 = 2).o Nếu n = 2: có 3 xâu (S2 = 3).o Với n > 2 thì số xâu nhị phân độ dài n bằng tổng số xâu nhị phân

độ dài n – 1 và n – 2 (Sn = Sn – 1 + Sn – 2).c. Có ít nhất hai bit 0 kề nhau:

o Số xâu độ dài n có ít nhất hai bit 0 kề nhau bằng số xâu độ dài n bất kì trừ đi số xâu độ dài n có hai bit 0 kề nhau.

CHƯƠNG TRÌNH#include <iostream>using std::cin;using std::cout;using std::endl;double S(int n);int main(){

int n,a,b;do{

cout << "Nhap do dai xau bit: ";cin >> n;

}while (n < 0);cout << "\nSo xau nhi phan co do dai " << n << endl;cout << "\tBat ki la: " << (a = pow(double (2), n)) << endl;cout << "\tKhong co hai bit 0 ke nhau la: " << (b = S(n)) <<

endl;cout << "\tIt nhat hai bit 0 ke nhau la: " << (a - b) << endl;cin.get();cin.get();

}double S(int n){

if(1 == n) return 2;else if (2 == n) return 3;else return (S(n-1) + S(n-2));

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 4

Page 6: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

}

Bài 1.2 Liệt kê các xâu bit độ dài nTHUẬT TOÁNĐể giải quyết bài toán này, ta dùng thuật toán quay lui để giải, thuật toán

mô tả như sau: Khai báo biến toàn cục: mảng s[100] (dùng để chứa xâu), n (độ dài

xâu bit), d (số xâu, d được khởi tạo bằng 0). Cần tạo các hàm:

o void print() kiểm tra xâu s có thỏa điều kiện, in ra xâu s và tăng biến đếm d lên 1.

o void Lke(int i) hàm đệ quy, dùng để gán giá trị vào mảng s. Khai báo biến j (kiểu nguyên), gán j = 0 lặp cho tới khi j = 1- Gán j vào mảng s- Xét đủ cấu hình thì in mảng s (hàm print())- Ngược lại thì gọi hàm Lke(i + 1)

Hàm main() o Nhận giá trị độ dài xâu bit: no Gọi hàm Lke(0)o In ra số xâu nhị phân đếm được. (xuất d)

a. Liệt kê các xâu bit độ dài n bất kìCHƯƠNG TRÌNH

#include <iostream>#include <conio.h>using namespace std;

int s[100], n, d (0);void print();void Lke(int i);

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 5

Page 7: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

int main(){

do{

cout << "Nhap gia tri n: ";cin >> n;

} while (!(n > 0));Lke(0);cout << "Vay co " << d << " xau bit do dai " << n;getch();

}void print(){

for(int k = 0; k < n; k++)cout << s[k];

cout << endl;d++;

}void Lke(int i){

for (int j = 0; j <= 1; j++){

s[i] = j;if(i == n - 1) print();else Lke(i+1);

}}

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 6

Page 8: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

b. Liệt kê các xâu bit độ dài n không có hai bit 0 kề nhau.Thuật toán câu b được kế thừa từ câu a. Hàm Lke của câu b có thêm điều

kiện if(!(i > 0 && s[i-1] == 0 && j == 0)) để loại trừ trường hợp hai bit 0 kề nhau

CHƯƠNG TRÌNH#include <iostream>#include <conio.h>

using namespace std;int s[100], n, d (0);void print();void Lke(int i);int main(){

cout << "Nhap gia tri n: ";cin >> n;Lke(0);cout << "\nVay co " << d << " xau nhi phan do dai " << n <<

" khong co hai bit 0 ke nhau.";getch();

}void print(){

for(int k = 0; k < n; k++)cout << s[k];cout << endl;

d++;

}void Lke(int i){

int j;for (j = 0; j <= 1; j++)

if(!(i > 0 && s[i-1] == 0 && j == 0)){

s[i] = j;if(i == n - 1) print();else Lke(i+1);

}}

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 7

Page 9: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

c. Liệt kê các xâu bit độ dài n có ít nhất hai bit 0 kề nhau.Thuật toán được phát triển từ câu a. Hàm print được thêm điều kiện để xét có hai bit 0 có kề nhau hay không.

void print(){

if(check()){

for(int k = 0; k < n; k++)cout << s[k];

cout << endl;d++;

}

}bool check (){

for(int i = 0; i < n - 1;i++)if (0 == s[i] && 0 == s[i+1])

return true;return false;

}

CHƯƠNG TRÌNH#include <iostream>#include <conio.h>using namespace std;

int s[100], n, d (0);void print();

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 8

Page 10: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

void Lke(int i);bool check();int main(){

do{

cout << "Nhap gia tri n: ";cin >> n;

} while (!(n > 0));Lke(0);cout << "\nVay co " << d << " xau nhi phan do dai " << n <<

" co it nhat hai bit 0 ke nhau.";getch();

}

void Lke(int i){

for (int j = 0; j <= 1; j++){

s[i] = j;if(i == n - 1) print();else Lke(i+1);

}}void print(){

if(check()){

for(int k = 0; k < n; k++)cout << s[k];

cout << endl;d++;

}

}bool check (){

for(int i = 0; i < n - 1;i++)if (0 == s[i] && 0 == s[i+1])

return true;return false;

}

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 9

Page 11: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

Bài 1.3: Viết chương trình nhập một xâu chữ gồm n chữ cái hoa (A...Z)-trong đó có một số chữ cái lặp. Liệt kê tất cả các cách sắp xếp n chữ cái này. Có đếm tổng số cách sắp xếp.THUẬT TOÁN

Dựa vào phương pháp sinh, các bước thực hiện:o Bước 1: Xây dựng cấu hình đầu tiên theo thứ tự từ điển. Sắp xếp lại xâu

theo chiều giảm: a[i] >= a[i+1] với i=1 , n−1. In ra cấu hình và số cách sắp xếp được khởi tạo giá trị bằng 1.

o Bước 2: Lặp cho tới khi đạt được cấu hình cuối có dạng a[i] <= a[i+1] với i=1 , n−1.

Trong quá trình lặp sinh xâu kế tiếp bằng cách hoán đổi 2 vị trí phần tử a[i] ≠ a[j] cho nhau. Điều kiện của i là tất cả các phần tử của xâu ở bên trái i được sắp sếp theo chiều tăng trừ phần tử i. Vì các phần tử của xâu được lưu vào vị trí từ 0 -> n-1 nên i – n chính là điều kiện để thoát khỏi vòng lặp, điều kiện của j là 1 trong i – 1 phần tử bên trái của phần tử i có giá trị nhỏ nhất nhưng a[j] > a[i]. Vì dãy bên trái của phần tử thứ i là dãy tăng, do đó chính là vị trí của phần tử đầu tiên lớn hơn a[i] nếu j = 1 -> i – 1. Sau khi hoán vị a[i] và a[j] cho ta sắp xếp lại tất cả các phần tử bên trái i theo chiều giảm, in ra cấu hình mới của xâu và tăng biến đếm lên.

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 10

Page 12: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

CHƯƠNG TRÌNH#include <iostream>#include <string.h>using namespace std;void swap(char &a, char &b){

char tmp = a;a = b;b = tmp;

}void sXepGiam(char* s, int n){

for(int i = 0; i < n; i++)for(int j = 0; j < i; j++)if (s[j] < s[i])

swap(s[j], s[i]);}bool ktInHoa(char* s){

for(int i = 0; i < strlen(s); i++)if(islower(s[i]))

return false;return true;

}int main(){

char s[100];int d (1);do{

cout << "Nhap xau in hoa: ";gets(s);

} while (!ktInHoa(s));int n = strlen(s);sXepGiam(s, n);cout << d << "\t" << s << endl;int i (1), j;while (i <n){

i = 1;while (s[i - 1] <= s[i] && i < n) i++;j = 0;while (s[j] <= s[i] && j < i) j++;swap(s[i], s[j]);sXepGiam(s, i);if (i < n){

d++;cout << d << "\t";cout << s << endl;

}}cout << "So xau thoa man: " << d;

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 11

Page 13: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

cin.get();}

Bài 1.4Xét phương trình nguyên: x1 + x2 + ... + xn = k với xi ≥ 0, i = 1 ... k. Viết chương trình nhập n, k và in ra tất cả các nghiệm của phương trình.Có đếm tổng số nghiệm.

Khai báo biến: mảng a[i] để chứa các nghiệm của phương trình. Nhập n và k. Dùng bài toán chỉnh hợp lặp chập n của k + 1 phần tử (0,1, … k):

o Khai báo biến sum.o Nếu k = 0 thì có nghiệm duy nhất x1 = x2 = … = xn = 0.o Ngược lại thì gán a[i] = 0.

Thay đổi a[i] để có a[i] kế tiếp theo bài toán chỉnh hợp lặp.Gán sum = a[i]. Nếu sum = k thì in kết quả a[i].

Thuật toán chỉnh hợp lặp chập k của n phần tử (phương pháp kiệt kê)

for (int c = 1; c < pow(double (k + 1), n); c++){

sum = 0;int i (n);while (s[i] == k)

i--;

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 12

Page 14: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

s[i]++;for(int j = i + 1;j <= n;j++)

s[j] = 0;for(int i = 1; i <= n; i++)

sum += s[i];}

CHƯƠNG TRÌNH

#include<conio.h>#include <iostream>#include <iomanip>using namespace std;void print(int* s, int n);

void main(){

int n,k, s[30];int count (0), sum (0);cout << "Nhap gia tri n, k: ";cin >> n >> k;for (int i = 1; i <= n; i++)

s[i] = 0;cout << "\nNghiem cua phuong trinh:\n";if (0 == k){

cout << ++count << '.';print(s, n);

}else{

for (int c = 1; c < pow(double (k + 1), n); c++){

sum = 0;int i (n);while (s[i] == k)

i--;s[i]++;for(int j = i + 1;j <= n;j++)

s[j] = 0;for(int i = 1; i <= n; i++)

sum += s[i];if (k == sum){

cout << setw(3) << ++count << '.';print(s, n);

}}

}cout << "\nPhuong trinh co " << count << " nghiem.";getch();

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 13

Page 15: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

}

void print(int* s, int n){for(int i = 1; i <= n; i++)

cout << setw(3) << s[i];cout << endl;

}

Bài tập 2. Bài toán trên đồ thịVi t ch ng trình phát sinh ng u nhiên ma tr n tr ng s Aế ươ ẫ ậ ọ ố nxn= (aij) nxn c a ủđ th vô h ng liên thông G g m ồ ị ướ ồ n đ nh (aỉ ij=aji i, j=1... n). 1. Ki m tra đ th G có ph i là đ th Euler hay không.ể ồ ị ả ồ ị2. Nh p hai đ nh x, y và dùng thu t toán Dijkstra đ tìm đ ng đi ng n ậ ỉ ậ ể ườ ắnh t t x đ n y. ấ ừ ế3. Dùng thu t toán Prim đ tìm cây ph nh nh t c a đ th G.ậ ể ủ ỏ ấ ủ ồ ị

Thu t toánậ2.1 Ki m tra đ th Eulerể ồ ị

D a vào đ nh lý: Đ th vô h ng liên thông là đ th Euler khi và ch khiự ị ồ ị ướ ồ ị ỉ không có đ nh b t l .ỉ ậ ẻ

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 14

Page 16: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

2.2 Tìm đ ng đi ng n nh t b ng thu t toán Dijkstraườ ắ ấ ằ ậo Khai báo bi n:ế

int v[30];int d[30];bool checked[30];int x , y, min;

M ng v đ l u đ nh k tr c đ nh vả ể ư ỉ ề ướ ỉ i, d là đ ng đi ngăn nh t t vườ ấ ừ 1 đ n ếvi, checked là m ng boolean đ đánh d u đ nh vả ể ấ ỉ i đã g n nhãn hay ch a, min là ắ ưs hi u c a đ nh có giá tr nh nh t v a xét.ố ệ ủ ỉ ị ỏ ấ ừo Kh i t o các giá trở ạ ị

for(int i = 0; i < n; i++){

checked[i] = false;d[i] = INF;v[i] = x;

}min = x;d[x] = 0;

o L p cho đ n khi đ nh có đ ng đi nh nh t (min) v a nh n đ c trùng v iặ ế ỉ ườ ỏ ấ ừ ậ ượ ớ i:

Tìm đ nh có đ ng đi ng n nh t đ n vỉ ườ ắ ấ ế x. G n nhãn l i cho các đ nh khácắ ạ ỉ

//Thực hiện gắEn nhãnfor(int i = 0; i < n; i++){

if (!checked[i] && d[i] >= d[min] + a[min][i])

{v[i] = min;d[i] = d[min] + a[min][i];

}}

2.3 Tìm cây ph nh nh t b ng thu t toán Primủ ỏ ấ ằ ậo Khai báo bi nế

bool complete (false);int w[30];bool isChecked[30];int v[30];int edge[30][2], count (0);

Bi n complete ki m tra thu t toán hoàn thành hay ch a, M ng v đ l u ế ể ậ ư ả ể ưđ nh k tr c đ nh vỉ ề ướ ỉ i, w là kho n cách c a đ nh đang xét và đ nh tr c nó, ả ủ ỉ ỉ ướchecked là m ng boolean đ đánh d u đ nh vả ể ấ ỉ i đã g n nhãn hay ch a. M ng ắ ư ảedge l u các c nh c a cây ph nh nh t. ư ạ ủ ủ ỏ ấ

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 15

Page 17: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

Ta ch n đ nh đ u tiên (đ nh vọ ỉ ầ ỉ 0 và g n nhãn cho các đ nh còn l i).ắ ỉ ạ L p cho đ n khi s c nh b ng n – 1 (count = n – 1) thì d ng:ặ ế ố ạ ằ ừ

a. Tìm c nh nh nh t c a đ th v i đi u ki n c nh tìm đ c ph i có 1ạ ỏ ấ ủ ồ ị ớ ề ệ ạ ượ ả đ nh ch a đánh d u và 1 đ nh đã đánh d u.ỉ ư ấ ỉ ấ

b. Tăng s c nh tìm đ c lên 1 (count++).ố ạ ược. G n nhãn m i cho các đ nh còn l i.ắ ớ ỉ ạ

CH NG TRÌNHƯƠ

#include <iostream>using namespace std;

const int INF = 5; //các giá trị >= INF đềMu được xem là vô cùng.int a[30][30];int n;

bool is_Euler (void);void khoiTaoMang();void Dijkstra(void);void Prim (void);int main(){

khoiTaoMang();Dijkstra();Prim();fflush(stdin);cin.get();

}

void khoiTaoMang(){

cout << "Nhap so dinh: ";cin >> n;//KhởXi tạo giá trị cho ma trận.

khoiTao:for (int j = 0; j < n; j++)

for (int i = j; i < n; i++)if(i == j)

a[i][j] = 0;else

a[i][j] = a[j][i] = rand() % INF + 1;//KiềXm tra tính liền thôngfor (int j = 0; j < n - 1; j++){

bool lienThong (false);for (int i = j + 1; i < n; i++)

if(a[i][j] < INF)lienThong = true;

if(!lienThong) goto khoiTao;}

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 16

Page 18: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

//In baXngcout << endl;for (int j = 0; j < n; j++){

for (int i = 0; i < n; i++)if(a[i][j] >= INF)

cout << "_\t";else

cout << a[i][j] << "\t";cout << endl << endl;

}//KiềXm tra có phaXi đôM thị Eulerif(!is_Euler())

cout << "Do thi vua khoi tao la do thi Euler!" << endl;else

cout << "Do thi vua khoi tao khong phai do thi Euler!" << endl;

}void Dijkstra(void){

//Tìm đường đi ngắEn nhấEtint v[30];int d[30];bool checked[30];int x , y, min;do{

cout << "Nhap hai dinh: ";cin >> x >> y;

} while (!(x < n && y < n));

for(int i = 0; i < n; i++){

checked[i] = false;d[i] = INF;v[i] = x;

}min = x;d[x] = 0;while (min != y){

//tìm giá trị nhoX nhấEtmin = y;for(int i = 0; i < n; i++)

if (!checked[i] && d[i] < d[min])min = i;

checked[min] = true;//thực hiện gắEn nhãnfor(int i = 0; i < n; i++){

if (!checked[i] && d[i] >= d[min] + a[min][i]){

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 17

Page 19: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

v[i] = min;d[i] = d[min] + a[min][i];

}}

}//In ra đường đi.cout << endl << "Duong di ngan nhat tu " << x << " den " << y <<

" : ";int i (y);cout << y;while (i != x){

cout << " <- ";i = v[i];cout << i;

}}bool is_Euler (void){

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

int deg (0); //bật cuXa một đỉXnhfor (int i = 0; i < n; i++)

if(i != j && a[i][j] < INF)deg++;

if(deg % 2) return false;}return true;

}void Prim (void){

bool complete (false);int w[30];bool isChecked[30];int v[30];int edge[30][2], count (0);for(int i = 0; i < n; i++){

w[i] = a[0][i];isChecked[i] = false;v[i] = 0;

}isChecked[0] = true;w[0] = INF;while (count < n){

//tim gia tri nho nhatint min (0);for(int i = 0; i < n; i++)

if (!isChecked[i] && w[i] < w[min])min = i;

isChecked[min] = true;edge[count][1] = min;

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 18

Page 20: Báo cáo thực hành TOÁN RỜI RẠC - ĐHBKĐN

Báo cáo thực hành TOÁN RỜI RẠC

edge[count][0] = v[min];count++;//thuc hien gan nhanfor(int i = 0; i < n; i++){

if (!isChecked[i] && w[i] > a[min][i]){

v[i] = min;w[i] = a[min][i];

}}

}count--;//xuấEt kềEt quaXcout << "\n\nCay phu nho nhat, voi cac canh:\n";for (int i = 0; i < count; i++)

cout << edge[i][0] << " <--> " << edge[i][1] << endl;}

_ _ _ -- H T -- Ế _ _ _

SV: Nguy n Văn Thu n – 11TCLCễ ậ Page 19