1. Trang chủ
  2. » Giáo án - Bài giảng

Bài tập toán rời rạc 2 Bộ môn Công nghệ phần mềm

58 2,9K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Bài tập toán rời rạc 2 Bộ môn Công nghệ phần mềm
Trường học Đại học Công nghệ Thông tin - Đại học Quốc gia Thành phố Hồ Chí Minh
Chuyên ngành Kỹ thuật phần mềm
Thể loại Bài tập
Năm xuất bản 2023
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 58
Dung lượng 757,75 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

MC LC Bài 1 Các khái niem cơ bn ca lý thuyêt ñô th ............................................. 3 Mc tiêu .................................................................................................................................. 3 a. Nhac li lý thuyêt ................................................................................................................. 3 b. ðê bài tap ............................................................................................................................ 3 c. Hưng dan gii .................................................................................................................... 4 d. Bài tap t gii ...................................................................................................................... 5 Bài 2 Bieu dien ñô th trên máy tính ................................................................... 6 Mc tiêu .................................................................................................................................. 6 a. Nhac li lý thuyêt ................................................................................................................. 6 b. ðê bài tap ............................................................................................................................ 6 c. Hưng dan gii .................................................................................................................... 7 d. Bài tap t gii .................................................................................................................... 10 Bài 3 ðô th Euler .................................................................................................. 12 Mc tiêu ................................................................................................................................ 12 a. Nhac li lý thuyêt ............................................................................................................... 12 b. ðê bài tap .......................................................................................................................... 13 c. Hưng dan gii .................................................................................................................. 13 d. Bài tap t gii .................................................................................................................... 14 Bài 4 ðô th Hamilton ........................................................................................... 15 Mc tiêu ................................................................................................................................ 15 a. Nhac li lý thuyêt ............................................................................................................... 15 b. ðê bài tap .......................................................................................................................... 15 c. Hưng dan gii .................................................................................................................. 15 d. Bài tap t gii .................................................................................................................... 19 Bài 5 Tho luan cài ñat ñô th, các thuat toán liet kê chu trình Euler và Hamilton.20 Bài 6 Thuat toán tìm kiêm trên ñô th và 7ng d9ng ...................................... 20 Mc tiêu ................................................................................................................................ 20 a. Nhac li lý thuyêt ............................................................................................................... 20 b. ðê bài tap .......................................................................................................................... 20 c. Hưng dan gii .................................................................................................................. 21 d. Bài tap t gii .................................................................................................................... 28 Bài 7 Cây và cây khung ......................................................................................... 29 Mc tiêu ................................................................................................................................ 29 a. Nhac li lý thuyêt ............................................................................................................... 29 b. ðê bài tap .......................................................................................................................... 30 c. Hưng dan gii .................................................................................................................. 30 d. Bài tap t gii .................................................................................................................... 36 Bài 8 Tho luan vê cài ñat thuat toán tìm cây khung nh? nhât trên ñô th ................... 38 Bài 9, 10 Bài toán tìm ñưBng ñi ngan nhât ...................................................... 38 Mc tiêu ................................................................................................................................ 38 a. Nhac li lý thuyêt ............................................................................................................... 38 b. ðê bài tap .......................................................................................................................... 38 c. Hưng dan gii .................................................................................................................. 40 d. Bài tap t gii .................................................................................................................... 47 Bài 12 Bài toán luông cDc ñEi trong mEng ....................................................... 50 Mc tiêu ................................................................................................................................ 50 a. Nhac li lý thuyêt ............................................................................................................... 50 b. ðê bài tap .......................................................................................................................... 51 c. Hưng dan gii .................................................................................................................. 51 d. Bài tap t gii .................................................................................................................... 53

Trang 1

Bài 1 Các khái niệm cơ bản của lý thuyết ñồ thị 3

Mục tiêu 3

a Nhắc lại lý thuyết 3

b ðề bài tập 3

c Hướng dẫn giải 4

d Bài tập tự giải 5

Bài 2 Biểu diễn ñồ thị trên máy tính 6

Mục tiêu 6

a Nhắc lại lý thuyết 6

b ðề bài tập 6

c Hướng dẫn giải 7

d Bài tập tự giải 10

Bài 3 ðồ thị Euler 12

Mục tiêu 12

a Nhắc lại lý thuyết 12

b ðề bài tập 13

c Hướng dẫn giải 13

d Bài tập tự giải 14

Bài 4 ðồ thị Hamilton 15

Mục tiêu 15

a Nhắc lại lý thuyết 15

b ðề bài tập 15

c Hướng dẫn giải 15

d Bài tập tự giải 19

Bài 5 Thảo luận cài ñặt ñồ thị, các thuật toán liệt kê chu trình Euler và Hamilton.20 Bài 6 Thuật toán tìm kiếm trên ñồ thị và ứng dụng 20

Mục tiêu 20

a Nhắc lại lý thuyết 20

b ðề bài tập 20

c Hướng dẫn giải 21

d Bài tập tự giải 28

Bài 7 Cây và cây khung 29

Mục tiêu 29

a Nhắc lại lý thuyết 29

b ðề bài tập 30

c Hướng dẫn giải 30

d Bài tập tự giải 36

Bài 8 Thảo luận về cài ñặt thuật toán tìm cây khung nhỏ nhất trên ñồ thị 38

Bài 9, 10 Bài toán tìm ñường ñi ngắn nhất 38

Mục tiêu 38

a Nhắc lại lý thuyết 38

b ðề bài tập 38

c Hướng dẫn giải 40

d Bài tập tự giải 47

Bài 12 Bài toán luồng cực ñại trong mạng 50

Mục tiêu 50

a Nhắc lại lý thuyết 50

b ðề bài tập 51

c Hướng dẫn giải 51

d Bài tập tự giải 53

Trang 2

LỜI NÓI ðẦU

Có thể nói toán học rời rạc là môn tiên quyết và hiệu quả nhất ñể người học nâng cao

tư duy toán học trong phân tích, thiết kế thuật toán và rèn luyện kỹ năng lập trình với những thuật toán phức tạp Không những thế nó còn là “cửa ngõ” ñể người học có thể tiếp cận với rất nhiều modul trong khoa học máy tính (như Chương trình dịch, lý thuyết tính toán, Trí tuệ nhân tạo, ) Bài tập ñể củng cố và nâng cao kiến thức trong môn học này

Về nội dung, bám sát với chương trình của nhà trường và hệ thống bài tập cũng ñược biên soạn theo các chương lý thuyết Với mỗi bài sẽ ñược chia thành 4 phần:

Phần A Nhắc lại lý thuyết: tóm tắt các kiến thức cơ bản, các ví dụ và các lưu ý hữu ích, các kinh nghiệm trong khi lập trình

Phần B ðề bài tập: ñưa ra các loại bài tập khác nhau, với các mức ñộ khác nhau Phần C Bài tập mẫu: Hướng dẫn giải một số bài tiêu biểu trong phần B, có phân tích thuật toán và cài ñặt chương trình

Phần D Bài tập tự giải: Người học thực hiện việc giải các bài tập này

Mong rằng tài liệu này ñáp ứng ñược phần nào nhu cầu của học sinh, sinh viên

Bộ môn: Công nghệ phần mềm Khoa: Công nghệ thông tin Trường: ðại học sư phạm kỹ thuật Hưng Yên

Trang 3

Bài 1 Các khái niệm cơ bản của lý thuyết ựồ thị

Mục tiêu

- Lưu trữ ựược ựồ thị trên máy tắnh theo những phương pháp khác nhau

- Cài ựặt ựược chương trình chuyển ựổi giữa các phương pháp

- Sinh viên có khả năng tự học

a Nhắc lại lý thuyết

- đơn ựồ thị vô hướng (định nghĩa 1.1)

- đa ựồ thị vô hướng (định nghĩa 1.2)

- đơn ựồ thị có hướng (định nghĩa 1.4)

- đa ựồ thị có hướng (định nghĩa 1.5)

- đường ựi ựộ dài n (định nghĩa 1.6)

- Chu trình là ựường ựi có ựỉnh ựầu trùng với ựỉnh cuối

- đường ựi (chu trình) ựược gọi là ựơn nếu như không có cạnh nào bị lặp lại

- đồ thị vô hướng liên thông (định nghĩa 1.8)

- đồ thị có hướng liên thông mạnh (định nghĩa 1.11)

- đồ thị có hướng liên thông yếu (định nghĩa 1.12)

- Cầu (định nghĩa 1.10)

- đồ thị ựịnh hướng ựược: đồ thị vô hướng liên thông là ựịnh hướng ựược khi và chỉ khi mỗi cạnh của nó nằm trên ắt nhất một chu trình (định lý 1.1)

- đỉnh kề: đỉnh V ựược gọi là kề với ựỉnh U nếu có cạnh (U,V)

- Biểu diễn ựồ thị G(V,E) dạng hình học

Biểu diễn ựỉnh: lấy các ựiểm trên mặt phẳng hay trên không gian tương ứng với các phần tử của tập V và dùng ngay ký hiệu các phần tử này ựẻ ghi trên các ựiểm tương ứng

Biểu diễn cạnh: Nếu cạnh e với hai ựỉnh ựầu là A, B thì nó ựược biểu diễn bằng ựoạn thẳng hay một ựoạn nối giữa hai ựiểm A, B và không ựi qua các ựiểm tương ứng trong không gian

Biểu diễn cung: nếu cung e có ựỉnh ựầu là C, ựỉnh cuối là D, thì nó ựược biểu diễn bằng một ựoạn thẳng hoặc ựoạn cong ựược ựịnh hướng ựi từ C sang D và không qua các ựiểm tương ứng trung gian khác

Chú ý: Hình nhận ựược gọi là dạng biểu diễn hình học của ựồ thị G(V, E) đôi khi người ta cũng gọi dạng biểu diễn hình học là một ựồ thị

b đề bài tập

Bài 1 Cho G ựồ thị gồm 4 phần G1, G2, G3 và G4 như sau:

a Chỉ ra tập ựỉnh, cạnh(vô hướng,có hướng, khuyên, ) của mỗi ựồ thị ựã cho? Chỉ loại ựồ thị ựó?

b đồ thị G, G1, G2, G3, G4 và G5 có liên thông không? Nếu ựồ thị không liên thông hãy chỉ ra các thành phần liên thông?

c đồ thị G, G1, G2, G3, G4 và G5 có chu trình không? Chỉ ra các chu trình của ựồ thị (nếu có)?

Trang 4

7 6

Trang 5

Bài tập 2 Khi về nghỉ hè mỗi bạn sinh viên của lớp TK7 trường ðHSPKTHY ñều trao ñổi ñịa chỉ với ít nhất một nửa số bạn trong lớp Chứng minh rằng trong thời gian nghỉ hè mỗi bạn của lớp TK7 ñều có thể báo tin trực tiếp hay gián tiếp cho các bạn trong lớp

Bài tập 3 Trong một cuộc họp có ñúng hai ñại biểu không quen nhau và mỗi ñại biểu này có một số lẻ người quen ñến dự Chứng minh rằng luôn luôn có thể xếp một số ñại biểu ngồi chen giữa hai ñại biểu nói trên, ñể người ngồi giữa hai người mà anh (chị) ta quen

Trang 6

Bài 2 Biểu diễn ñồ thị trên máy tính

Mục tiêu

- Nêu ñược các cách biểu diễn ñồ thị và biểu diễn ñồ thị trên máy tính trên máy tính

- ðưa ra ñược ma trận kề, danh sách các cạnh, cung tương ứng với 1 ñồ thị cho trước

- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau

- Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học

- Sinh viên có khả năng tự học

a Nhắc lại lý thuyết

- Biểu diễn ñồ thị dạng ma trận kề

A=( ai,j: i, j = 1, 2, ,n)

ai,j = 1 , nếu có cạnh từ i sang j hay (i, j) ∈ E, i, j =1, 2, ., n

ai, j = 0, trong trường hợp còn lại tức là không có cạnh(i, j)

- Biểu diễn ñồ thị dạng danh sách các cạnh (cung)

E=(ei,j: i= 1, 2, ,m; j = 1, 2) (ei,1,ei,2) là cạnh thứ i trong m cạnh (cung) của ñồ thị

- Biểu diễn ñồ thị dạng danh sách kề

Ke(v)= { u ∈ V: (v,u)∈ E }

b ðề bài tập

Bài 1 Cho G ñồ thị gồm 4 phần G1, G2, G3 và G4 như sau:

a Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng ma trận kề

b Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng danh sách cạnh(cung)

c Biểu diễn các ñồ thị G,G1,G2,G3,G4 dưới dạng danh sách kề

Bài 2 Xây dựng chương trình ñọc dữ liệu từ file text (ñồ thị biểu diễn dạng danh sách cạnh)

và lưu vào ma trận kề và hiển thị ra màn hình

G 1

1

4 3

7 6

Trang 7

Bài 2 Xây dựng chương trình ñọc dữ liệu từ file text (ñồ thị biểu diễn dạng danh sách cạnh)

và lưu vào ma trận kề và hiển thị ra màn hình

Chương trình minh họa:

using System;

using System.IO;

Trang 8

namespace LTDT

{

class mtrke_DScanh

{

//I: "d:/trr/DScanh.in", luu do thi theo DS canh vao tep text

//O: "d:/trr/mtrke.out" Doc tep va ghi BD ma tran ke

static string filenameIN = "d:/dsc";

static string filenameOUT = "d:/mtk";

static public void nhaptep()

//ghi Dl vao tep DScanh.in

//D1: luu so dinh va so canh

//D2 Dm+1

ft.WriteLine("{0} {1}", n, m); //ghi DL vao D1 cua tep DScanh.in

Console.Write("nhap 2 dau va Trong So");

for (int i = 0; i < m; i++)

//doc tep "d:/trr/DScanh.in", DS canh, ghi BD ma tran ke "d:/trr/mtrke.out"

static public void doctep()

Trang 9

int[,] a = new int[n, n]; //mang luu do thi theo mtran ke

//tep "d:/trr/DScanh.out" luu D1 so dinh va so canh cua dthi

//d2 dm+1, Di+1 lan luot luu thong tinh ve canh thu i

Trang 10

Kết quả ñầu vào và ñầu ra tương ứng cho chương trình trên

"d:/dsc.in" "d:/mtk.out" "d:/dsc.in" "d:/mtk.out"

Trang 11

Bài tập 2 Cài ñặt chương trình nhập ñồ thị biểu diễn dạng ma trận kề (danh sách cạnh(cung), danh sách kề) từ tệp và hiển thị ñồ thị ra màn hình

Bài tập 3 Cài ñặt chương trình nhập ñồ thị biểu diễn dạng ma trận kề (danh sách

cạnh(cung), danh sách kề) từ tệp và hiển thị ñồ thị biểu diễn dạng còn lại ra màn hình Bài tập 4 ðọc dữ liệu từ file text (ñồ thị biểu diễn dạng ma trận kề) và lưu vào danh sách kề

Trang 12

Bài 3 ðồ thị Euler

Mục tiêu

- Kiểm tra ñược một ñồ thị bất kỳ có là ñồ thị euler hay không

- Áp dụng ñược thuật toán tìm chu trình Euler, ñường Euler, với 1 ñồ thị cho trước

- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau Cài ñặt ñược chương trình chuyển ñổi giữa các phương pháp

- Cài ñặt ñược thuật toán Tìm chu trình Euler

- Cài ñặt ñược thuật toán duyêt ñồ thị duyệt theo chiều sâu hoặc duyệt theo chiều rộng

- Sinh viên có khả năng tự học

a Nhắc lại lý thuyết

- Chu trình (t.ư ñường ñi) ñơn chứa tất cả các cạnh (hoặc cung) của ñồ thị (vô hướng hoặc có hướng) G ñược gọi là chu trình (t.ư ñường ñi) Euler Một ñồ thị liên thông (liên thông yếu ñối với ñồ thị có hướng) có chứa một chu trình (t.ư ñường ñi) Euler ñược gọi là

ñồ thị Euler (t.ư nửa Euler)

ðịnh lý: ðồ thị (vô hướng) liên thông G là ñồ thị Euler khi và chỉ khi mọi ñỉnh của G ñều

Xuất phát từ một ñỉnh bất kỳ của G và tuân theo hai quy tắc sau:

1 Mỗi khi ñi qua một cạnh nào thì xoá nó ñi; sau ñó xoá ñỉnh cô lập (nếu có);

2 Không bao giờ ñi qua một cầu, trừ phi không còn cách ñi nào khác

Trang 13

b ðề bài tập

Bài 1 ðồ thị sau có là ñồ thị nửa Euler hay ñồ thị Euler không? Giải thích?

Bài 2 Dùng thuật toán Flor ñể tìm tìm chu trình Euler cho ñồ thị

a

d

b

c G2

Trang 14

Bài 2 Dùng thuật toán Flor ñể tìm tìm chu trình Euler cho ñồ thị sau:

Xuất phát từ u, ta có thể ñi theo cạnh (u,v) hoặc (u,x), giả sử là (u,v) (xoá (u,v))

Từ v có thể ñi qua một trong các cạnh (v,w), (v,x), (v,t), giả sử (v,w) (xoá (v,w))

Tiếp tục, có thể ñi theo một trong các cạnh (w,s), (w,y), (w,z), giả sử (w,s) (xoá (w,s))

ði theo cạnh (s,y) (xoá (s,y) và s) Vì (y,x) là cầu nên có thể ñi theo một trong hai cạnh (y,w), (y,z), giả sử (y,w) (xoá (y,w))

ði theo (w,z) (xoá (w,z) và w) và theo (z,y) (xoá (z,y) và z)

Tiếp tục ñi theo cạnh (y,x) (xoá (y,x) và y)

Vì (x,u) là cầu nên ñi theo cạnh (x,v) hoặc (x,t), giả sử (x,v) (xoá (x,v))

Tiếp tục ñi theo cạnh (v,t) (xoá (v,t) và v)

Liệu có cách nào qua tất cả các ñường, mỗi ñường ñúng 1 lần hay không? Xây dựng giải thuật và cài ñặt chương trình giúp cho người lái xe khách du lịch

Bài tập 3 Một trạm quảng ñường giao thông phải chịu trách nhiêm về tình trạng của một mạng lưới giao thông nối giữa các ñiểm dân cư Hàng tháng, họ phải cử một ñội ñi kiểm tra một vòng qua khắp mạng lưới ñể xem xét tình trạng hiện thời của các ñường giao thông nhằm báo sửa chữa kịp thời nếu có nhu cầu Hãy viết chương trình nhập vào mạng lưới giao thông và giúp trạm quyết ñịnh lộ trình của ñội kiểm tra sao cho có thể thăm tất cả các con ñường mà tổng chiều dài ñoạn ñường ñi qua là nhỏ nhất

Trang 15

Bài 4 ðồ thị Hamilton

Mục tiêu

- Kiểm tra ñược một ñồ thị bất kỳ có là ñồ thị Hamilton hay không

- Áp dụng ñược thuật toán tìm chu trình Hamilton, ñường Hamilton, với 1 ñồ thị cho trước

- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau Cài ñặt ñược chương trình chuyển ñổi giữa các phương pháp

- Cài ñặt ñược thuật toán Tìm chu trình Halmiton

- Cài ñặt ñược thuật toán duyêt ñồ thị duyệt theo chiều sâu hoặc duyệt theo chiều rộng

- Sinh viên có khả năng tự học

Bài 1 ðồ thị sau có là ñồ thị nửa Hamilton hay ñồ thị Hamilton không? Giải thích?

Bài 2 Liệt kê tất cả các chu trình Hamilton của ñồ thị

Trang 16

ðồ thị G2 là ñồ thị nửa Hamilton

ðồ thị G4 là ñồ thị Hamilton, vì có chu trình Hamilton (1,3,5,2,4,1)

Bài 2 Liệt kê tất cả các chu trình Hamilton của ñồ thị

ðồ thị và cây liệt kê chu trình Hamilton của nó theo thuật toán quay lui

Trong trường hợp ñồ thị có không quá nhiều cạnh thuật toán trên có thể sử dụng ñể kiểm tra

ñồ thị có phải là Hamilton hay không

Chương trình minh họa:

Trang 17

static int []dinh;

static bool[] chuaxet;

public static void readF()

{

int x, y;

StreamReader read = new StreamReader("dsk2.txt");

string line = read.ReadLine();

string[] xaucon = new string[2];

xaucon = line.Split(' ');

m = int.Parse(xaucon[0]);

n = int.Parse(xaucon[1]);

ke = new Node [n + 1];

dinh = new int[n + 1];

chuaxet = new bool[n+1];

Trang 19

Console.WriteLine("Cac chu trinh trong do thi la:");

có hãy chỉ ra một cách sắp Cài ñặt chương trình

Bài tập 3 Tổng thư ký ðại hội ñồng Liên hợp quốc triệu tập một cuộc họp có N nhà ngoại giao của N tổ chức tham gia Các ñại diện ngoại giao ñược bố trí ngồi quanh một bàn tròn Giữa một số tổ chức có quan hệ căng thẳng, vì vậy không thể xếp họ ngồi cạnh nhau ñược Thông tin về quan hệ giữa các tổ chức ñược cho dưới dạng cặp số nguyên i, j nếu giữa 2 tổ chức này có quan hệ căng thẳng Hãy lập trình giúp Tổng thư ký Liên hợp quốc bố trí chỗ ngồi quanh bàn họp Các tổ chức ñược ñánh số từ 1 tới N, 0 < N <= 500

Dữ liệu vào: từ file CONF.INP, dòng ñầu tiên chứa số nguyên N, các dòng sau, mỗi dòng một cặp số i, j cho biết các ñại diện i và j không ngồi cạnh nhau ñược Kết thúc là một dòng chứa 2 số 0

Kết quả: ñưa ra file CONF.OUT Nếu không có cách bố trí thỏa mãn yêu cầu thì ñưa

ra thông báo KHONG CO, trong trường hợp ngược lại – ñưa ra dãy N số nguyên xác ñịnh vị trí ai ngồi cạnh ai quanh bàn tròn

Bài tập 4 Có 12 người ngồi chung 1 bàn tiệc tròn Mỗi người có ít nhất 6 người quen Hãy chỉ ra cách sắp xếp sao cho mỗi người ñều ngồi cạnh người mình quen Tổng quát, hãy sắp

N người ngồi chung quanh bàn tròn sao cho mỗi người ñều ngồi cạnh người mình quen Biết mỗi người có ít nhất (N + 1)/2 người quen

Trang 20

Bài 5 Thảo luận cài ñặt ñồ thị, các thuật toán liệt kê chu trình Euler

và Hamilton

Mục tiêu

- Lưu trữ ñược ñồ thị trên máy tính theo những phương pháp khác nhau

- Chuyển ñổi giữa các kiểu biểu diễn ñồ thị trên máy tính

- Nâng cao khả năng làm việc nhóm

- Rèn luyện tư duy sáng tạo

- Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học

- Sinh viên có khả năng tự học

Bài 6 Thuật toán tìm kiếm trên ñồ thị và ứng dụng

Mục tiêu

- Trình bày ñược ý tưởng, cách cài ñặt và cài ñặt ñược thuật toán BFS, DFS

- Nêu ưu nhược của từng thuật toán ñối với từng loại ñồ thị

- Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học

- Sinh viên có khả năng tự học

- Rèn luyện tư duy sáng tạo

a Nhắc lại lý thuyết

DFS: Từ một ñỉnh v nào ñó ta bắt ñầu duyệt như sau: ñánh dấu v ñã duyệt, với mỗi ñỉnh w chưa duyệt kề với v, ta thực hiện ñệ qui quá trình trên cho w Sở dĩ cách duyệt này có tên là duyệt theo chiều sâu vì nó sẽ duyệt theo một hướng nào ñó sâu nhất có thể ñược

BFS: Từ một ñỉnh v nào ñó ta bắt ñầu duyệt như sau: ñánh dấu v ñã ñược duyệt, kế ñến là duyệt tất cả các ñỉnh kề với v Khi ta duyệt một ñỉnh v rồi ñến ñỉnh w thì các ñỉnh kề của v ñược duyệt trước các ñỉnh kề của w

b ðề bài tập

Bài 1 Duyệt ñồ thị theo chiều sâu và duyệt theo chiều rộng trên ñồ thị sau (Dùng cây tìm kiếm ñể từ ñó mô tả kết quả)

Bài 2 Cho ñồ thị G=(V,E) Cài ñặt 2 thuật toán duyệt ñồ thị và ñưa ra thứ tự duyệt

Bài 3 Cho ñồ thị G=(V,E) với tập các ñỉnh X và tập các cung E Xét xem ñồ thị có bao nhiêu thành phần liên thông, mỗi thành phần liên thông bao gồm những ñỉnh nào?

Trang 21

- Lặp: Lấy từ hàng ñợi ra, duyệt tất cả ñỉnh kề chưa xét ñưa vào hàng ñợi chờ xét

Kết quả theo từng bước của thuật toán duyệt rộng ñược mô tả trong bảng sau:

Trạng thái hàng ñợi ðỉnh ñang duyệt Các ñỉnh ñã duyệt Các ñỉnh chưa

Cách 2: Ta dùng ngăn xếp mô tả lại từng bước thuật toán

- ðưa 1 vào ngăn xếp

- Lặp: Lấy từ ngăn xếp ra, duyệt tất cả ñỉnh kề chưa xét ñưa vào ngăn xếp chờ xét

Kết quả theo từng bước của thuật toán duyệt sâu ñược mô tả trong bảng sau:

Trang 22

Ta ñược kết quả như sau: 1, 2, 3, 4, 5

b Tương tự câu a Dựa vào ñồ thị xây dựng ñược cây nhị phân tìm kiếm, rồi từ ñó duyệt ñồ thị ta ñược

Duyệt theo chiều rộng sẽ ñược kết quả các ñỉnh ñược xét lần lượt như sau:

S, A, D, B, E, C, F, G Duyệt theo chiều sâu sẽ ñược kết quả các ñỉnh ñược xét lần lượt như sau:

S, A, B, C, E, D, F, G Bài 2

Giả sử ñã có các hàm (thủ tục) liên quan tới hàng ñợi và ngăn xếp như sau

public class Queue

{

const int qmax = 1000; //qmax la hang so luu kich thuoc toi da cua hang doi static int[] q = new int[qmax]; //cai dat hang doi, toi da 1000 ptu

static int qf, ql; //qf: dau hang, ql: cuoi hang

static public void initQ(); //Khoi tao hang doi

static public bool fullQ() ; //Kiem tra day

static public bool emptyQ(); //Kiem tra rong

static public void putQ(int x); //Dua phan tu vao hang doi

static public int getQ(); //lay phan tu tu hang doi ra

Trang 23

static public void initS(); //Khoi tao ngan xep

static public bool fullS(); //Kiem tra day

static public bool emptyS(); //Kiem tra rong

static public void pushS(int x); //Dua phan tu vao ngan xep

static public int popS(); //lay phan tu tu ngan xep ra

static string filename = "d:/trr/mtk_b2_t216.in";

static int [,] a; //luu do thi mtran ke

static int xp,n,count;

//dinh xuat phat khi duyet, n la so dinh cua do thi, count dem so thu tu khi duyet static int[] kq; //luu thhu tu duyet

static bool[] xet; //danh dau xet cho n dinh cua do thi; n la so dinh cua do thi //doc do thi (BD theo ma tran ke) tu tep txt

static public void doctep(string filename)

//hien thi do thi

static private void hien_dt(int[,] x)

//Duyet do thi => dua ra thu tu duyet

//ten n dinh cua dt la 1,2, n; ta coi nhu ten cac dinh la 0 n-1

static private void init()

//danh dau chua xet cho tat ca cac dinh cua do thi

xet = new bool[n];

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

xet[i] = false;

kq=new int[n];

count = 0;

}

Trang 24

static private void BFS()

{

init();

//1 day dinh xp vao Queue, danh dau xet cho dinh xp

Queue.putQ(xp); xet[xp] = true;

kq[count++] = xp;

//cai dat theo thuat toan MR:

//lap qua trinh lay tu Q ra de xet, danh dau xet trc khi day vao Q

do{

int u = Queue.getQ(); //lay u o dau Q , la dinh dg xet

for(int i=0;i<n;i++) //tim tat ca cac dinh i ke u, i chua xet

if (a[u, i] > 0 && xet[i] == false)

//1 day dinh xp vao Queue, danh dau xet cho dinh xp

Stack.pushS(xp); xet[xp] = true;

kq[count++] = xp;

//cai dat theo thuat toan MR:

//lap qua trinh lay tu Q ra de xet, danh dau xet trc khi day vao Q

do

{

int u = Stack.popS(); //lay u o dau Q , la dinh dg xet

for (int i = 0; i < n; i++) //tim tat ca cac dinh i ke u, va chua xet

if (a[u, i] > 0 && xet[i] == false)

Trang 25

static private void ketqua()

{

Console.WriteLine("thu tu duyet thu dc nhu sau:");

for (int i = 0; i < count; i++)

Console.WriteLine("\n \tnhap 0 de thoat: ");

case 4: ketqua(); break;

case 5: hien_dt(a); break;

Trang 26

Bài 3 Thuật toán tìm số thành phần liên thông

Cách 1: Sử dụng thủ tục duyệt ñồ thị (bài 2 ở trên)

Cách 2: Duyệt ñồ thị bằng cách duyệt ñệ quy

Chương trình minh họa:

static string filename = "d:/trr/mtk_b2_t216.in";

static int [,] a; //luu do thi mtran ke

static int xp,n, sotp=0;

//dinh xuat phat khi duyet, n la so dinh cua do thi, count dem so thu tu khi duyet static int[] lt; //luu 1 ñỉnh thuộc thhu tu duyet

static bool[] xet; //luu 1 ñỉnh thuộc thhu tu duyet

static public void doctep(string filename)

//hien thi do thi

static private void hien_dt(int[,] x)

//Duyet do thi => dua ra thu tu duyet

//ten n dinh cua dt la 1,2, n; ta coi nhu ten cac dinh la 0 n-1

//Duyet do thi de quy cac dinh thuoc cung 1 TPLT tu dinh u,

static private void TimLT(int u)

{

lt[u]=solt;

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

if(a[u,i]>0 && xet[i]==false)//Duyet cac dinh i chua xet ke u

Console.WriteLine ("\n So tplt cua do thi la: {0}\t",sotp);

for (int i = 1; i <= sotp; i++)

Trang 28

d Bài tập tự giải

Bài tập 1 Duyệt ñồ thị theo chiều sâu và duyệt theo chiều rộng trên ñồ thị sau:

Bài tập 2 Có N thành phố với tên từ 1 dến N, N<100 Giữa một số cặp thành phố ñã có thiết

kế ñường 2 chiều

1 Liệu thiết kế hệ thống ñường ñã ñảm bảo việc ñi lại giữa 2 thành phố bất kì chưa?

2 Nếu câu trả lời của câu 1 là chưa, hãy xét xem cần thiết kế thêm ít nhất những ñưòng ñể

có thể ñảm bảo việc ñi lại giữa 2 thành phố bất kì

3 Nếu câu trả lời 1 là rồi, hãy chọn một số ñường cần xây dựng ñể có thể ñảm bảo việc ñi lại giữa 2 thành phố bất kì

Bài tập 3 Theo thiết kế, 1 mạng giao thông gồm N nút có tên từ 1 ñến N, N<=100 Chi phí

ñể xây dựng ñường 2 chiều trực tiếp từ nút i ñến nút j bằng a[i,j]=a[j,i], với mọi i, a[i,i]=0 Hai tuyến ñường khác nhau không cắt nhau tại ñiểm không là ñầu mút Hiện ñã xây dựng ñược k tuyến ñường

Bài toán ñặt ra như sau: Hệ thống ñường ñã xây dựng ñã bảo ñảm sự ñi lại giữa 2 nút bất kỳ chưa? Nếu chưa, hãy chọn 1 số tuyến ñường cần xây dựng thêm sao: Các tuyến ñường sẽ xây dựng thêm cùng các tuyến ñường ñã xây dựng bảo ñảm sự ñi lại giữa 2 nút bất kỳ

Trang 29

Bài 7 Cây và cây khung

Mục tiêu

- Xác ñịnh ñược một ñường ñi, một chu trình trong ñồ thị bất kỳ

- Biểu diễn ñồ thị trên máy tính bằng các phương pháp khác nhau

- Áp dụng ñược thuật toán Kruskal và Prim ñể tìm cây khung nhỏ nhất ứng với một ñồ thị xác ñịnh Cài ñặt ñược cả 2 thuật toán Kruskal và Prim

- Phân tích ñược bài toán thực tế tương ứng phần lý thuyết ñã học

- Sinh viên có khả năng tự học

a Nhắc lại lý thuyết

Các ñịnh nghĩa: cây (ñịnh nghĩa 7.1), cây khung (ñịnh nghĩa 7.2)

Cây khung nhỏ nhất Cho ñồ thị vô hướng liên thông có trọng số G =(V,E) Giả sử T=(V,Et)

là cây khung của ñồ thị G Cây khung T ñược gọi là cây khung nhỏ nhất của ñồ thị G nếu tổng ñộ dài các cạnh C(H) của nó là nhỏ nhất

Chu trình cơ bản (ðịnh nghĩa 7.3)

ðịnh lý 7.1 Cho T là một ñồ thị có n ≥ 2 ñỉnh Các ñiều sau là tương ñương:

1) T là một cây

2) T liên thông và có n−1 cạnh

3) T không chứa chu trình và có n−1 cạnh

4) T liên thông và mỗi cạnh là cầu

5) Giữa hai ñỉnh phân biệt bất kỳ của T luôn có duy nhất một ñường ñi sơ cấp

6) T không chứa chu trình nhưng khi thêm một cạnh mới thì có ñược một chu trình duy nhất

Bài toán cây khung nhỏ nhất

ðầu vào: ðồ thị G

ðầu ra: cây khung nhỏ nhất

Thuật toán Kruskal

Ý tưởng: Hợp nhất các vùng liên thông bằng cách xét cạnh có trọng số nhỏ nhất mà không tạc chu trình

Thuật toán:

B1: Chọn một trong số các cạnh có trọng số nhỏ nhất

B2: Chọn một trong số các cạnh có trọng số nhỏ nhất trong các cạnh còn lại

B3: Chọn một trong số các cạnh có trọng số nhỏ nhất trong các cạnh còn lại, mà không tạo thành chu trình (tức là cạnh ñược chọn là cạnh xét nhưng phải nối giữa 2 thành phần liên thông khác nhau)

Lặp lại bước 3 cho tới khi thu ñược cây khung (tức là tất cả các vùng liên thông ñược hợp nhất làm một hay ñồ thị thu ñược có n-1 cạnh)

Thuật toán Prim

Ngày đăng: 27/06/2014, 08:37

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w