Xây dựng, phát triển chương trình

Một phần của tài liệu Chu trình Hamilton tổng quát trong đồ thị vô hướng Nguyễn Văn Thái. (Trang 55 - 59)

Luận văn sử dụng phương pháp dùng ma trận kề để biểu diễn đồ thị trên máy tính. Chương trình gồm 3 lớp chính và Form hiển thị kết quả thu được. Ngoài ra chương trình sử dụng một số class, phương thức nhằm bổ trợ cho việc thể hiện thuật toán.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

3.3.3.1. Lớp MyFile.class

Trong lớp Myfile.class ta sử dụng phương thức public static

int[][] readFile(String filename) để đọc ma trận kề và phương

thức public static void saveFile(String filename, int[][]

matran) để lưu ma trận vào máy tính.

3.3.3.2. Lớp MaTran.class

Trên lớp Matran.class thực hiện các chức năng như: Tính bậc của đỉnh, sắp xếp các bậc của đỉnh theo chiều giảm dần, kiểm tra tính liên thông của đồ thị, kiểm tra đồ thị có phải đồ thị 2-liên thông ... Để duyệt đồ thị, chương trình sử dụng thuật toán duyệt theo chiều sâu (DFS).

3.3.3.3. Lớp DoThi.class

Trên lớp Dothi.class chủ yếu thực hiện các chức năng kiểm tra đồ thị có phải đồ thị đầy đủ không? Kiểm tra xem đồ thị có thuộc 5 lớp các đồ thị đặc biệt K (K1, K2, K3, K4, K5)hay không. Phương thức isDominating nhằm đưa ra kết luận xem đồ thị có thuộc lớp đồ thị đặc biệt K, hay có chu trình trội hay không...

Sau đây là đoạn chương trình kiểm tra đồ thị có thuộc lớp K1 hay không (các lớp còn lại tương tự).

public static bool kiemTraK1(MaTran m) {

int[] fix = new int[m.nMaTran]; int r = m.dsDinh[m.nMaTran - 1].bac; //Bước 1: kiểm tra |V|=3r

if (m.nMaTran != 3 * r) return false;

// Bước 2: chọn 2 đỉnh u, v có bậc lớn nhất kiểm tra deg(u)=deg(v)<2(r- 1)

//Nếu thỏa mãn đk thì xóa 2 đỉnh này, fix=0 chưa xóa đỉnh, fix=1 đã xóa đỉnh

int u = 0, v = 0;

for (int i = 0; i < m.nMaTran; i++) {

fix[i] = 0; }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

int max = m.dsDinh[0].bac; if (m.dsDinh[1].bac == max) { u = m.dsDinh[0].dinh; v = m.dsDinh[1].dinh; fix[u] = 1; fix[v] = 1;

if (max < 2 * (r - 1)) return false; }

// Bước 3: tìm kiếm K_{r-1,r-1,r}

int count1 = 0, count2 = 0;//Đếm số lượng đồ thị đầy đủ Kr-1 và Kr

for (int i = 0; i < m.nMaTran; i++) {

int[] K = new int[m.nMaTran]; int dem = 0;

//nếu i chưa bị xóa và i chưa nằm trong K

if ((fix[i] == 0 && !(K.Contains(i))) || (fix[i] == 0 && i == 0)) {

K[dem] = i;

for (int j = 0; j < m.nMaTran; j++) (adsbygoogle = window.adsbygoogle || []).push({});

if (fix[j] == 0 || fix[j] == 2 || fix[j] == 3) if (!K.Contains(j) && (m.mang[i][j] == 1)) {

dem++; K[dem] = j; }

//Nếu đồ thị đầy đủ và có r-1 đỉnh

if (check_Kn(m, K, dem + 1) == true && dem + 1 == r - 1) {

count1++;

for (int d = 0; d < dem + 1; d++) {

fix[K[d]] = 2;//Đánh dấu đỉnh trong đồ thị đầy đủ Kr-1

} }

//Nếu đồ thị đầy đủ và có r đỉnh

if (check_Kn(m, K, dem + 1) == true && dem + 1 == r) {

count2++;

for (int d = 0; d < dem + 1; d++)

fix[K[d]] = 3; //Đánh dấu đỉnh trong đồ thị đầy đủ Kr

} } }

// Nếu không tìm được đồ thị Kr-1 và 1 đồ thị Kr thì không phải K1

if (count1 != 2 || count2 != 1) return false;

//Bước 4 kiểm tra các đỉnh trong K_{r-1,r-1,r} có nối với 2 đỉnh u,v trên

for ( int i = 0; i < m.nMaTran; i++) {

if (fix[i] == 2 || fix[i] == 3)

if (m.mang[u][i] != 1 || m.mang[v][i] != 1) return false;

}

//Xong cả 4 bước mà vẫn đúng thì thuộc K1

K1 = true; return true; }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Kết quả cuối cùng được đưa ra màn hình bằng phương thức

isDominating(MaTran m) sẽ cho biết đồ thị cho trước có chứa chu trình trội hay không. Đoạn mã nguồn mô tả phương thức như sau:

public static string isDominating(MaTran m) {

int kt = 2; K1 = K2 = K3 = K4 = K5 = lopK = KAll = false; //tìm bậc các đỉnh

m.tinhBac();

//Sắp xếp dãy bậc không tăng m.sapXepDinh(); (adsbygoogle = window.adsbygoogle || []).push({});

int min = m.dsDinh[m.nMaTran - 1].bac;

if (!m.KiemTra2LienThong()) return "Không là đồ thị 2 liên thông"; else { if (min < m.nMaTran / 3) return "Đồ thị không hợp lệ bậc nhỏ nhất >=n/3"; else { if (min < 3) { kt = 1;

lopK=true;//đồ thị ko thuộc lớp K

} else

if (kiemTraK1(m) || kiemTraK2(m) || kiemTraK3(m) || kiemTraK4(m) || kiemTraK5(m))

{

kt = 0;

KAll = true;////đồ thị thuộc lớp K

} else

{

kt = 1;

lopK = true;//đồ thị ko thuộc lớp K

}

if (kt == 0)

return "Đồ thị không có chu trình Dominating!"; else if (kt == 1)

return "Đồ thị có chu trình dominating!"; }

}

return ""; }

3.3.3.4. Form1.cs

Đây là giao diện đưa kết quả ra màn hình chương trình. Trong Form1.cs thực hiện việc hiển thị các kết quả lên giao diện của chương trình. Trên giao diện chính của chương trình gồm hai phần: Phần biểu diễn đồ thị bằng ma trận kề và phần hiển thị kết quả kiểm tra đồ thị. Ngoài ra trên giao

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

diện cho phép người sử dụng thực hiện các chức năng như: nạp đồ thị, lưu đồ thị, kiểm tra đồ thị, thành phần liên thông, kiểm tra đồ thị có chu trình trội hay không...

Một phần của tài liệu Chu trình Hamilton tổng quát trong đồ thị vô hướng Nguyễn Văn Thái. (Trang 55 - 59)