giao trinh th ltdt

52
 BOÄ GIAÙO DUÏC VAØ ÑAØO TAÏO TRÖÔØNG ÑAÏI HOÏC DAÂN LAÄP CÖÛU LONG KHOA COÂNG NGHEÄ THOÂNG TIN  GIAÙO TRÌNH THÖÏC HAØNH LYÙ THUYEÁT ÑOÀ THÒ VA THUAÄT GIAÛI Bieân Soaïn: ÑAØO ANH PHA Vónh Long, 05/2006

Upload: uyenphong1107

Post on 07-Apr-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 1/52

 BOÄ GIAÙO DUÏC VAØ ÑAØO TAÏO

TRÖÔØNG ÑAÏI HOÏC DAÂN LAÄP CÖÛU LONGKHOA COÂNG NGHEÄ THOÂNG TIN

 

GIAÙO TRÌNH THÖÏC HAØNH 

LYÙ THUYEÁT ÑOÀ THÒ VAØ

THUAÄT GIAÛI

Bieân Soaïn: ÑAØO ANH PHA

Vónh Long, 05/2006

Page 2: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 2/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

MỤC LỤC

MỘT SỐ BÀI TOÁN...................................................................................................2 BÀI TOÁN 1.................................................................................................................2 

BÀI TOÁN 2.................................................................................................................3 BÀI TOÁN 3.................................................................................................................4 BÀI TOÁN 4.................................................................................................................5 BÀI TOÁN 6.................................................................................................................7 BÀI TOÁN 7.................................................................................................................8 BÀI TOÁN 8.................................................................................................................9 BÀI TOÁN 9...............................................................................................................10 BÀI TOÁN 10.............................................................................................................11 HƯỚ NG DẪN CÀI ĐẶT BÀI TOÁN......................................................................12 BÀI TOÁN 1...............................................................................................................12 

BÀI TOÁN 2...............................................................................................................17 BÀI TOÁN 3...............................................................................................................20 BÀI TOÁN 4...............................................................................................................22 BÀI TOÁN 5...............................................................................................................25 BÀI TOÁN 6...............................................................................................................32 BÀI TOÁN 7...............................................................................................................35 BÀI TOÁN 8...............................................................................................................38 BÀI TOÁN 9...............................................................................................................43 BÀI TOÁN 10.............................................................................................................48 

 Biên Soạn: Đào Anh Pha Trang 1

Page 3: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 3/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

MỘT SỐ BÀI TOÁNBÀI TOÁN 1

Viế t chươ ng trình tìm bậc cao nhấ t của đỉ nh trong đồ thị vớ i đồ thị vô hướ ng A[i,j]vớ i A[i,j]=1 nế u có đườ ng đ i t ừ i đế n j và ng ượ c l ại A[i,j] = 0 nế u không có đườ ng đ it ừ i đế n j.

 Dữ liệu vào: cho trong file Bai1.inp -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100).-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ liệu ra: thông báo k ế t quả ra màn hình số bậc cao nhấ t của đỉ nh trong đồ thị đ ã cho.Ví dụ:Bai1.inp K ết quả:

6  Bac cao nhat: 4 0 1 1 0 0 01 0 0 1 1 01 0 0 0 1 00 1 0 0 1 00 1 1 1 0 10 0 0 0 1 0

Bai1.inp K ết quả:5  Bac cao nhat: 4 

0 1 0 0 11 0 1 1 10 1 0 0 10 1 0 0 11 1 1 1 0

Yêu cầu x ử lý:

a)  Tìm đỉnh có bậc cao nhất. b)  Tìm bậc nhỏ nhẩt của đỉnh.c)  Tìm đỉnh có bậc nhỏ nhất.d)  Tính tổng bậc của đồ thị.e)  Đếm số đỉnh bậc chẵn và bậc lẻ. 

Ví d ụ:   K ế t quả:

a)  Đỉnh 2,5. b)  Bậc 2.c)  Đỉnh 1,3,4.d)  Tổng bậc của đồ thị 14.e)  Số đỉnh bậc chẵn 5, số đỉnh bậc lẻ 0. 

 Biên Soạn: Đào Anh Pha Trang 2

Page 4: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 4/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 2

Viế t chươ ng trình kiể m tra tính liên thông của một đồ thị vô hướ ng A[i,j] vớ i A[i,j]=1nế u có đườ ng đ i t ừ i đế n j và ng ượ c l ại A[i,j] = 0 nế u không có đườ ng đ i t ừ i đế n j.

 Dữ liệu vào: cho trong file Bai2.inp 

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100).-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ liệu ra: thông báo k ế t quả ra màn hình ”DO THI LIEN THONG” hay “ DO THI KHONG

 LIEN THONG”.

Ví dụ:Bai2.inp K ết quả:5  DO THI LIEN THONG 0 0 0 0 10 0 1 0 00 1 0 1 00 0 1 0 11 0 0 1 0

Bai2.inp K ết quả:8  DO THI LIEN THONG 0 1 0 0 0 1 0 01 0 1 0 0 0 0 00 1 0 1 0 0 0 0

0 0 1 0 1 0 0 00 0 0 1 0 1 0 01 0 0 0 1 0 1 00 0 0 0 0 1 0 10 0 0 0 0 0 1 0

Bai2.inp K ết quả:6  DO THI KHONG LIEN THONG0 1 1 0 0 01 0 1 0 0 01 1 0 0 0 0

0 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

 Biên Soạn: Đào Anh Pha Trang 3

Page 5: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 5/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 3

Viế t chươ ng trình đế m số thành phần liên thông của đồ thị vô hướ ng Anxn vớ i:- A[i,j] = 1 nế u có đườ ng đ i t ừ i đế n j.- A[i,j] = 0 nế u không có đườ ng đ i t ừ i đế n j.

- A[i,j] = A[j,i]. Dữ liệu vào: cho trong file Bai2.inp nội dung d ữ  liệu giố ng d ữ liệu Bài Toán 2. Dữ liệu ra: hiể n thị số thành phần liên thông của đồ thị ra màn hình.Ví dụ:Bai3.inp K ết quả:6 2 0 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

Bai3.inp K ết quả:5 1  0 0 0 0 10 0 1 0 00 1 0 1 00 0 1 0 1

1 0 0 1 0

Bai3.inp K ết quả:8 1 0 1 0 0 0 1 0 01 0 1 0 0 0 0 00 1 0 1 0 0 0 00 0 1 0 1 0 0 00 0 0 1 0 1 0 01 0 0 0 1 0 1 0

0 0 0 0 0 1 0 10 0 0 0 0 0 1 0 

 Biên Soạn: Đào Anh Pha Trang 4 

Page 6: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 6/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 4

Có n thành phố biế t r ằ ng đườ ng đ i giữ a hai các thành phố (nế u có) là đườ ng đ i haichiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận Anxn trong đ ó:

a.   A[i,j] = 1 nế u có đườ ng đ i t ừ thành phố i đế n thành phố j.

b.   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j.c.   A[i,j] = A[j,i].

 Hãy xác định mọi đườ ng t ừ thành phố   D đế n thành phố  C (nế u có). Dữ liệu vào: cho trong file Bai4.inp

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C. -   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ liệu ra: Xuấ t ra màn hình mọi đườ ng đ i t ừ  đỉ nh D đế n C hay thông báo không t ồnt ại đườ ng đ i t ừ   D đế n C .Ví dụ:Bai4.inp K ết quả:5 1->2->3->4->51 5 1->2->4->50 1 0 0 1 1->51 0 1 1 00 1 0 1 0

0 1 1 0 11 0 0 1 0

Bai3.inp K ết quả:5 1->2->3->4->51 5 1->2->50 1 0 1 1 1->4->3->2->51 0 1 0 1 1->4->50 1 0 1 0 1->51 0 1 0 11 1 0 1 0

Bai4.inp K ết quả:6 KHONG CO DUONG DI TU 1 DEN 41 40 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

 Biên Soạn: Đào Anh Pha Trang 5

Page 7: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 7/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 5 

M ột l ướ i giao thông hai chiề u giữ a n địa đ iể m đượ c cho bở i ma tr ận A[i,j] trong đ ó A[i,j]=1 nế u có đườ ng đ i t ừ i đế n j, còn A[i,j] = 0 trong tr ườ ng hợ  p ng ượ c l ại. M ột ng ườ i đư a thơ cần đ i qua t ấ t cả các con đườ ng này để phát thơ  , mỗ i đườ ng chỉ qua

một l ần. Hãy xác định một l ộ trình của ng ườ i đư a thơ này (có thể  t ồn t ại nhiề u l ộ trình khác nhau) hay thông báo không t ồn t ại đườ ng như vậ y.

 Dữ liệu vào: cho trong file Bai5.inp. -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.

ni ≤≤1

 Dữ liệu ra: In ra màn hình đườ ng đ i của ng ườ i đư a thơ (nế u có).Ví dụ:

Bai5.inp K ết quả:5 1->2->3->4->2->5->40 1 0 0 01 0 1 1 10 1 0 1 00 1 1 0 10 1 0 1 0

Bai5.inp K ết quả:5 KHONG TON TAI DUONG DI 

0 1 0 0 01 0 1 1 10 1 0 1 10 1 1 0 10 1 1 1 0

Bai5.inp K ết quả:5 2->1->5->4->2->3->40 1 0 0 11 0 1 1 0

0 1 0 1 00 1 1 0 11 0 0 1 0

 Biên Soạn: Đào Anh Pha Trang 6 

Page 8: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 8/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 6

M ột ng ườ i khách du l ịch muố n đ i thă m n thành phố  đượ c đ ánh số  t ừ 1 đế n n, mỗ ithành phố ng ườ i khách chỉ muố n đ i qua chúng một l ần. M ạng l ướ i giao thông giữ a nthành phố  là hai chiề u và đượ c cho bở i ma tr ận A[i,j] trong đ ó A[i,j] =1 nế u có

đườ ng đ i giữ a thành phố i và thành phố j, A[i,j] = 0 trong tr ườ ng hợ  p ng ượ c l ại. Hãy viế t chươ ng trình thiế t l ậ p cho ng ườ i khách một l ộ trình (có thể  t ồn t ại

nhiề u l ộ trình) hay thông báo không t ồn t ại l ộ trình theo yêu cầu của khách. Dữ liệu vào: cho trong file Bai6.inp 

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng 2 ghi đỉ nh mà ng ườ i khách du l ịch xuấ t phát.-   Dòng i+1 (   ) chứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ liệu ra: In ra màn hình đườ ng đ i của ng ườ i khách (nế u có).Ví dụ:Bai6.inp K ết quả:5 1->2->3->4->510 1 0 0 01 0 1 1 10 1 0 1 00 1 1 0 1

0 1 0 1 0Bai6.inp K ết quả:6 KHONG TON TAI DUONG DI10 1 1 0 0 01 0 1 0 1 01 1 0 0 0 10 0 0 0 1 00 1 0 1 0 00 0 1 0 0 0

Bai6.inp K ết quả:6 KHONG TON TAI DUONG DI10 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

 Biên Soạn: Đào Anh Pha Trang 7 

Page 9: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 9/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 7

Có n thành phố biế t r ằ ng đườ ng đ i giữ a các thành phố là đườ ng đ i hai chiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận A[i,j] trong đ ó:

-   A[i,j] là độ dài đườ ng đ i t ừ thành phố i đế n thành phố j.

-   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j.-   A[i,j] = A[j,i]-   A[i,j] nguyên, không âm.

 Hãy xác định đườ ng đ i ng ắ n nhấ t t ừ thành phố   D đế n thành phố  C . Dữ liệu vào: đồ thị đ ã liên thông và cho trong file Bai7.inp

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C .-   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.

ni ≤≤1

 Dữ liệu ra: xuấ t ra màn hình đườ ng đ i ng ắ n nhấ t t ừ  đỉ nh D đế n C và giá tr ị đườ ng đ ing ắ n nhẩ t tìm đượ c. 

Ví dụ: 

Bai7.inp K ết quả:6 DUONG DI NGAN NHAT LA: 5

1 6 1->2->4->6

0 1 2 0 0 0

1 0 2 2 3 0

2 2 0 5 4 0

0 2 5 0 3 2

0 3 4 3 0 4

0 0 0 2 4 0

Bai7.inp K ết quả:6 DUONG DI NGAN NHAT LA: 8

1 6 1->2->4->60 1 4 0 0 01 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

 Biên Soạn: Đào Anh Pha Trang 8

Page 10: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 10/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 8

M ột công ty cần thay toàn bộ hệ thố ng dây đ iện cho n phòng làm việc. Cho biế t sơ  đồ đ iện hiện có của n că n phòng này đượ c biề u diễ n bằ ng ma tr ận A[i,j] trong đ ó:

-   A[i,j]=A[j,i] chính là chiề u dài dây đ iện nố i liề n giữ a hai phòng i và j.

-   A[i,j] = A[j,i] = 0 nế u i không nố i liề n vớ i j. Hãy l ậ p trình tính độ dài cuả dây d ẫ n cần sử d ụng sao cho cả n phòng đ iề u có

đ iện và số l ượ ng này là ít nhấ t. Dữ liệu vào: cho trong file Bai8.inp ( đồ thị cho đ ã liên thông).

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)

-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở imột khoảng tr ắ ng.

ni ≤≤1

 Dữ liệu ra: l ư u trong file Bai8.out vớ i nội dung sau:

-   Dòng đầu l ư u độ dài dây d ẫ n nhỏ nhấ t -  Các dòng còn l ại l ư u đườ ng đ i cần nố i đ iện giữ a đỉ nh i nố i vớ i đỉ nh j có

tr ọng số A[i,j] (i -> j = A[i][j]).

Ví dụ: Bai8.inp Bai8.out

50 3 3 2 23 0 2 3 2

3 2 0 1 42 3 1 0 42 2 4 4 0

71 -> 4 = 24 -> 3 = 1

1 -> 5 = 23 -> 2 = 2

Bai8.inp Bai8.out

80 2 3 4 0 0 0 02 0 3 0 4 0 0 0

3 3 0 7 6 5 2 04 0 7 0 0 0 3 00 4 6 0 0 4 0 80 0 5 0 4 0 1 60 0 2 3 0 1 0 50 0 0 0 8 6 5 0

201 -> 2 = 21 -> 3 = 3

3 -> 7 = 27 -> 6 = 17 -> 4 = 32 -> 5 = 47 -> 8 = 5

 Biên Soạn: Đào Anh Pha Trang 9

Page 11: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 11/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 9

Có n thành phố  đượ c đ ánh số t ừ 1 đế n n. M ạng l ướ i giao thông giữ a các thành phố làđườ ng hai chiề u. Trên đườ ng đ i t ừ thành phố i đế n thành phố j, ng ườ i ta không đượ cmang quá A[i,j] đơ n vị hàng. N ế u không có đườ ng đ i t ừ thành phố i đế n thành phố j

thì xem như A[i,j] = 0. C ần vận chuyể n hàng t ừ thành phố   D đế n thành phố  C . Hãythiế t l ậ p k ế hoạch vận chuyể n sao cho khố i l ượ ng hàng vận chuyể n là nhiề u nhấ t.

 Dữ liệu vào: đồ thị đ ã liên thông và cho trong file Bai9.inp vớ i nội dung -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C.-   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ liệu ra: xuấ t ra màn hình k ế hoạch vận chuyể n t ừ  đỉ nh D đế n C và giá tr ị đườ ng 

đ i ng ắ n nhẩ t tìm đượ c. Ví dụ: Bai9.inp K ết quả:6 KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 21 6 1->3->4->60 1 2 0 0 01 0 2 2 3 02 2 0 5 4 00 2 5 0 3 2

0 3 4 3 0 40 0 0 2 4 0

Bai9.inpK ết quả:

6 KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 31 6 1->3->4->2->5->60 1 4 0 0 01 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

 Biên Soạn: Đào Anh Pha Trang 10

Page 12: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 12/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 10

Có n thành phố biế t r ằ ng đườ ng đ i giữ a các thành phố là đườ ng đ i hai chiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận A[i,j] trong đ ó:

-   A[i,j] là độ dài đườ ng đ i t ừ thành phố i đế n thành phố j.

-   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j.-   A[i,j] = A[j,i].-   A[i,j] nguyên, không âm.

 Hãy xác định đườ ng đ i dài nhấ t t ừ thành phố   D đế n thành phố  C vớ i đ iề u kiện thành phố  đ ã qua không đượ c đ i l ại. Dữ liệu vào: đồ thị đ ã liên thông và cho trong file Bai10.inp

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C.

-   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở imột khoảng tr ắ ng.

ni ≤≤1

 Dữ liệu ra: xuấ t ra màn hình đườ ng đ i dài nhấ t t ừ  đỉ nh D đế n C và giá tr ị đườ ng đ ing ắ n nhẩ t tìm đượ c. 

Ví dụ: 

Bai10.inp K ết quả:6 DUONG DI DAI NHAT LA: 16

1 6 1->2->4->3->5->6

0 1 2 0 0 0

1 0 2 2 3 0

2 2 0 5 4 0

0 2 5 0 3 2

0 3 4 3 0 4

0 0 0 2 4 0

Bai10.inp K ết quả:

6 DUONG DI DAI NHAT LA: 251 6 1->3->4->2->5->60 1 4 0 0 01 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

 Biên Soạn: Đào Anh Pha Trang 11

Page 13: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 13/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN CÀI ĐẶT BÀI TOÁN

BÀI TOÁN 1

Viế t chươ ng trình tìm bậc cao nhấ t của đỉ nh trong đồ thị vớ i đồ thị vô hướ ng A[i,j]

vớ i A[i,j]=1 nế u có đườ ng đ i t ừ i đế n j và ng ượ c l ại A[i,j] = 0 nế u không có đườ ng đ it ừ i đế n j.

 Dữ li ệ u vào: cho trong file Bai1.inp -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100).-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.

ni ≤≤1

 Dữ li ệ u ra: thông báo k ế t quả ra màn hình số bậc cao nhấ t của đỉ nh trong đồ thị đ ã cho.Ví dụ:

Bai1.inp K ết quả:6  Bac cao nhat: 4 0 1 1 0 0 01 0 0 1 1 01 0 0 0 1 00 1 0 0 1 00 1 1 1 0 10 0 0 0 1 0

Bai1.inp K ết quả:5  Bac cao nhat: 4 0 1 0 0 11 0 1 1 10 1 0 0 10 1 0 0 11 1 1 1 0

Yêu cầu x ử lý:

f)  Tìm đỉnh có bậc cao nhất.g)  Tìm bậc nhỏ nhẩt của đỉnh.

h)  Tìm đỉnh có bậc nhỏ nhất.i)  Tính tổng bậc của đồ thị.

 j)  Đếm số đỉnh bậc chẵn và bậc lẻ.Ví d ụ:   K ế t quả:

f)  Đỉnh 2,5.g)  Bậc 2.h)  Đỉnh 1,3,4.i)  Tổng bậc của đồ thị 14.

Số đỉnh bậc chẵn 5, số đỉnh bậc lẻ 0.

 Biên Soạn: Đào Anh Pha Trang 12

Page 14: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 14/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN CÀI ĐẶT

T ổ ng số phần t ử khác không trên dòng i của ma tr ận liên k ế t của đồ thị chínhlà số bậc của đỉ nh i (i=1..n). Bậc lớ n nhất của đỉnh: Tính bậc từng đỉnh của đồ thị, so sánh tìm ra bậc lớ n nhất.

 Đỉnh có bậc lớ n nhất: Tính bậc từng đỉnh của đồ thị, so sánh vớ i bậc lớ n nhất củađồ thị nếu bằng thì xuất đỉnh có bậc lớ n nhất ra màn hình.

 Bậc nhỏ nhất của đỉnh: Tính bậc từng đỉnh của đồ thị, so sánh tìm ra bậc nhỏ nhất. Đỉnh có bậc nhỏ nhất: Tính bậc từng đỉnh của đồ thị, so sánh vớ i bậc nhỏ nhất củađồ thị nếu bằng thì xuất đỉnh có bậc nhỏ nhất ra màn hình.

 Tìm đỉnh bậc lẻ và số đỉnh bậc lẻ: Tính bậc từng đỉnh của đồ thị, kiểm tra đỉnhtươ ng ứng có phải là bậc lẻ hay không nếu phải xuất ra màn hình và tăng số đỉnh

 bậc lẻ lên 1. 

Tìm đỉnh bậc chẵn và số đỉnh bậc chẵn: tươ ng tự như tìm số đỉnh bậc lẻ. Tổng bậc của đồ thị: Tổng tất cả các phần tử khác không của ma tr ận liên k ết chính

là tổng số bậc của đồ thị.

CHƯƠ NG TRÌNH MẪU #include <stdio.h>#include <conio.h>#include <iostream.h>#include <values.h>#define TenFile "Bai1.inp"

/*Dọc file dữ liệu bài toán*/void Doc_File(int **A,int &n) { 

FILE*f = fopen(TenFile,"rb");fscanf(f,"%d",&n);*A = new int [n];cout<<"Ma Tran Lien Ket Cua Do Thi";for(int i =0;i<n;i++) {

A[i] = new int [n];cout<<endl;for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);cout<<" "<<A[i][j];

}}fclose(f);

}/*Bậc lớ n nhất của đỉnh*/int BacLonNhat(int**A,int n) { 

int max = 0,Bac;

 Biên Soạn: Đào Anh Pha Trang 13

Page 15: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 15/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

for(int i = 0; i<n; i++) {Bac = 0;for(int j = 0; j<n; j++)if(A[i][j]>0)

Bac++;if(Bac > max)max = Bac;

}return max;

}/*Bậc nhỏ nhất của đỉnh*/int BacNhoNhat(int**A,int n){ 

int min = MAXINT,Bac;

for(int i = 0; i<n; i++) {Bac = 0;for(int j = 0; j<n; j++)if(A[i][j]>0)

Bac++;if(Bac < min)

min = Bac;}return min;

}/*Tổng bậc của đồ thị*/int TongBac(int**A,int n){ 

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

Tong++;return Tong;

}/*Các đỉnh có bậc nhỏ nhất*/void DinhBacNhoNhat(int**A, int n){ 

int min = BacNhoNhat(A,n), Bac;for(int i = 0; i<n; i++) {

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

Bac++;

if(Bac == min)cout<<" "<<i+1;

 Biên Soạn: Đào Anh Pha Trang 14 

Page 16: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 16/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

}}/*Các đỉnh có bậc lớ n nhất*/void DinhBacLonNhat(int**A, int n){ 

int max = BacLonNhat(A,n), Bac;for(int i = 0; i<n; i++) {Bac = 0;for(int j = 0; j<n; j++)if(A[i][j]>0)

Bac++;if(Bac == max)

cout<<" "<<i+1;}

}/*Các đỉnh bậc chẵn và số đỉnh bậc chẵn*/void DinhBacChan(int**A, int n) { 

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

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

Bac++;

if(Bac%2==0) {cout<<" "<<i+1;Tong++;

}}cout<<"\n\t So Dinh Bac Chan: "<<Tong;

}/*Các đỉnh bậc lẻ và số đỉnh bậc lẻ*/void DinhBacLe(int**A, int n){ 

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

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

Bac++;if(Bac%2==1) {

cout<<" "<<i+1;Tong++;

}}

 Biên Soạn: Đào Anh Pha Trang 15

Page 17: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 17/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

cout<<"\n\t So Dinh Bac Le: "<<Tong;}/*Chuong Trinh Chinh*/void main() { 

clrscr();int **A,n;Doc_File(A,n);cout<<"\n1. Bac Lon Nhat Cua Dinh: "<<BacLonNhat(A,n);cout<<"\n2. Dinh Co Bac Lon Nhat:";DinhBacLonNhat(A,n);cout<<"\n3. Bac Nho Nhat Cua Dinh: "<<BacNhoNhat(A,n);cout<<"\n4. Dinh Co Bac Nho Nhat:";DinhBacNhoNhat(A,n);

cout<<"\n5. Dinh Co Bac Chan:";DinhBacChan(A,n);cout<<"\n6. Dinh Co Bac Le:";DinhBacLe(A,n);cout<<"\n7. Tong Bac Cua Do Thi: "<<TongBac(A,n);delete*A;getch();

}

 Biên Soạn: Đào Anh Pha Trang 16 

Page 18: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 18/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 2

Viế t chươ ng trình kiể m tra tính liên thông của một đồ thị vô hướ ng A[i,j] vớ i A[i,j]=1nế u có đườ ng đ i t ừ i đế n j và ng ượ c l ại A[i,j] = 0 nế u không có đườ ng đ i t ừ i đế n j.

 Dữ li ệ u vào: cho trong file Bai2.inp 

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100).-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ li ệ u ra: thông báo k ế t quả ra màn hình ”DO THI LIEN THONG” hay “ DO THI KHONG

 LIEN THONG”.

Ví dụ:Bai2.inp K ết quả:5  DO THI LIEN THONG 0 0 0 0 10 0 1 0 00 1 0 1 00 0 1 0 11 0 0 1 0

Bai2.inp K ết quả:8  DO THI LIEN THONG 0 1 0 0 0 1 0 01 0 1 0 0 0 0 00 1 0 1 0 0 0 0

0 0 1 0 1 0 0 00 0 0 1 0 1 0 01 0 0 0 1 0 1 00 0 0 0 0 1 0 10 0 0 0 0 0 1 0

Bai2.inp K ết quả:6  DO THI KHONG LIEN THONG0 1 1 0 0 01 0 1 0 0 01 1 0 0 0 0

0 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

 Biên Soạn: Đào Anh Pha Trang 17 

Page 19: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 19/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN THUẬT TOÁN

Ý t ưở ng: S ử d ụng thuật toán loang . Bướ c 1: Xuất phát từ một đỉnh bất k ỳ của đồ thị. Ta đánh dấu đỉnh xuất phát và chuyểnsang bướ c 2. 

 Bướ c 2: Từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j nếu A[i,j] = 1 và j chưa đượ c đánhdấu và chuyển sang bướ c 3.

 Bướ c 3: Thực hiện bướ c 2 cho đến khi không còn thực hiện đượ c nữa chuyển sang bướ c 4. Bướ c 4: Kiểm tra nếu số đỉnh đánh dấu nhỏ hơ n n (hay tồn tại ít nhất một đỉnh chưa đượ cđánh dấu) đồ thị sẽ không liên thông và ngượ c lại đồ thị liên thông.

HƯỚ NG DẪN CÀI ĐẶT Tổ chức cấu trúc dữ liệu để lưu tr ữ sự đánh dấu các đỉnh của đồ thị.

  Ta tổ chức một mảng 1 chiều (char*DanhDau) để lưu tr ữ những đỉnh của đồ thị có đượ c đánh dấu hay không. Chỉ số của mảng chính là chỉ số đỉnh của đồ thị.

  DanhDau[i]=0 nếu đỉnh i chưa đượ c đánh dấu và DanhDau[i]=1 nếu đỉnh i đãđượ c đánh dấu. Ví dụ: DanhDau[5]=1, DanhDau[3]=0 có ngh ĩ a là đỉnh thứ 5 củađồ thị đã đượ c dánh đấu và đỉnh thứ 3 của đồ thị chưa đượ c dánh dấu.

  Trong thuật toán, tr ướ c tiên ta khở i tạo tất cả các đỉnh của đồ thị là chưa đượ cđánh dấu. Ngh ĩ a là DanhDau[i]=0, i=0..n-1.

o  Dánh dấu đỉnh dầu tiên của đồ thị (DanhDau[0]=1).o 

Từ đỉnh i đã đánh dấu (DanhDau[i]=1), ta đánh dấu đỉnh j (DanhDau[j]=1)nếu A[i][j] = 1 và j chưa đượ c đánh dấu (DanhDau[j]=0). Cứ tiế p tục như vậycho đến khi không thực hiện đượ c nữa.

o   Nếu đỉnh nào chưa đánh dấu (tồn tại DanhDau[k]=0, 0≤ k<n) thì đồ thị không liên thông và ngượ c lại. 

CHƯƠ NG TRÌNH MẪU

#include <stdio.h>#include <conio.h>#include <iostream.h>#define TenFile "Bai2.inp"

 /*Dọc file d ữ liệu*/ void Doc_File(int **A,int &n){

FILE*f = fopen(TenFile,"rb");fscanf(f,"%d",&n);*A = new int [n];cout<<"Ma Tran Lien Ket Cua Do Thi";for(int i =0;i<n;i++) {

A[i] = new int [n];cout<<endl;

 Biên Soạn: Đào Anh Pha Trang 18

Page 20: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 20/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

for(int j =0;j<n;j++) {fscanf(f,"%d",&A[i][j]);cout<<" "<<A[i][j];

}

}fclose(f);}

 /*Kiể m tra liên thông: N ế u liên thông tr ả về giá tr ị 1, ng ượ c l ại tr ả về giá tr ị 0*/ char Lien_Thong(int **A,int n) {

char*DanhDau = new char [n];char ThanhCong;int Dem=0;for(int i = 0; i<n; i++)

DanhDau[i] = 0;DanhDau[0] = 1;Dem++;do { ThanhCong =1;

for(i = 0; i<n; i++)if(DanhDau[i]==1) {

for(int j = 0; j<n; j++)if (DanhDau[j] == 0 && A[i][j] > 0) {

DanhDau[j] = 1;

ThanhCong =0;Dem++;if(Dem == n) return 1;

}}

}while (ThanhCong == 0);return 0;

} /*Chươ ng trình chính*/ 

void main() {clrscr();int **A,n;Doc_File(A,n);if (Lien_Thong(A,n)==1)

cout<<"\nDO THI LIEN THONG";else cout<<"\nDO THI KHONG LIEN THONG";delete *A;getch();

}

 Biên Soạn: Đào Anh Pha Trang 19

Page 21: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 21/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 3

Viế t chươ ng trình đế m số thành phần liên thông của đồ thị vô hướ ng Anxn vớ i:- A[i,j] = 1 nế u có đườ ng đ i t ừ i đế n j.- A[i,j] = 0 nế u không có đườ ng đ i t ừ i đế n j.

- A[i,j] = A[j,i]. Dữ li ệ u vào: cho trong file Bai2.inp nội dung d ữ  liệu giố ng d ữ liệu Bài T ậ p2. Dữ li ệ u ra: hiể n thị số thành phần liên thông của đồ thị ra màn hình.Ví dụ:Bai3.inp K ết quả:6 2 0 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

Bai3.inp K ết quả:5 1 0 0 0 0 10 0 1 0 00 1 0 1 00 0 1 0 1

1 0 0 1 0

Bai3.inp K ết quả:8 1 0 1 0 0 0 1 0 01 0 1 0 0 0 0 00 1 0 1 0 0 0 00 0 1 0 1 0 0 00 0 0 1 0 1 0 0

1 0 0 0 1 0 1 00 0 0 0 0 1 0 10 0 0 0 0 0 1 0

HƯỚ NG DẪN THUẬT TOÁN

Ý t ưở ng: S ử d ụng thuật toán loang giố ng như bài toán 1. Bướ c 0: Khở i tạo số thành phần liên thông bằng 0.  Bướ c 1: Xuất phát từ một đỉnh chưa đượ c đánh dấu của đồ thị. Ta đánh dấu đỉnhxuất phát, tăng số thành phần liên thông lên 1 và chuyển sang bướ c 2. 

 Bướ c 2: Từ một đỉnh i đã đánh dấu, ta đánh dấu đỉnh j nếu A[i,j] = 1 và j chưa đượ c đánhdấu và chuyển sang bướ c 3.

 Biên Soạn: Đào Anh Pha Trang 20

Page 22: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 22/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

 Bướ c 3: Thực hiện bướ c 2 cho đến khi không còn thực hiện đượ c nữa chuyển sang bướ c 4. Bướ c 4: Nếu số số đỉnh đánh dấu bằng n (mọi đỉnh đều đượ c đánh dấu) k ết thúc thuậttoán, ngượ c lại quay về bướ c 1.

Chú ý: N ế u số thành phần liên thông bằ ng 1 đồ thị liên thông. HƯỚ NG DẪN CÀI ĐẶT 

Cài đặ t t ươ ng t ự như bài toán 2.CHƯƠ NG TRÌNH MẪU

 /*Hàm tr ả về số thành phần liên thông của đồ thị vô hướ ng */ int TPLien_Thong(int **A, int n) {

char*DanhDau = new char [n];char ThanhCong;

int Dem=0, i,j, MLT=0;for( i = 0; i<n; i++)

DanhDau[i] = 0;do { j = 0;

while(DanhDau[j]==1) j++;

DanhDau[j] = 1;Dem++;MLT++;

do {ThanhCong =0;for(i = 0; i<n; i++)if(DanhDau[i]==1)

for(j = 0; j<n; j++)if (DanhDau[j] == 0 && A[i][j] > 0) {

DanhDau[j] = 1;ThanhCong =1;Dem++;

if(Dem == n) return MLT;}

}while (ThanhCong == 1);} while(Dem<n);return MLT;

}

 Biên Soạn: Đào Anh Pha Trang 21

Page 23: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 23/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 4 

Có n thành phố biế t r ằ ng đườ ng đ i giữ a hai các thành phố (nế u có) là đườ ng đ i haichiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận Anxn trong đ ó:

d.   A[i,j] = 1 nế u có đườ ng đ i t ừ thành phố i đế n thành phố j.

e.   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j. f.   A[i,j] = A[j,i].

 Hãy xác định mọi đườ ng t ừ thành phố   D đế n thành phố  C (nế u có). Dữ li ệ u vào: đồ thị liên thông và cho trong file Bai4.inp

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C -   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ li ệ u ra: Xuấ t ra màn hình mọi đườ ng đ i t ừ  đỉ nh D đế n C hay thông báo không t ồnt ại đườ ng đ i t ừ   D đế n C .Ví dụ:Bai4.inp K ết quả:5 1->2->3->4->51 5 1->2->4->50 1 0 0 1 1->51 0 1 1 00 1 0 1 0

0 1 1 0 11 0 0 1 0

Bai3.inp K ết quả:5 1->2->3->4->51 5 1->2->50 1 0 1 1 1->4->3->2->51 0 1 0 1 1->4->50 1 0 1 0 1->51 0 1 0 11 1 0 1 0

Bai4.inp K ết quả:6 KHONG CO DUONG DI TU 1 DEN 41 40 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

 Biên Soạn: Đào Anh Pha Trang 22

Page 24: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 24/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN THUẬT TOÁNS ử d ụng k  ỹ thuật tìm kiế m theo chiề u sâu.

HƯỚ NG DẪN CÀI ĐẶT

S ử d ụng k  ỹ thuật cài đặ t tìm kiế m theo phươ ng pháp đệ quy.CHƯƠ NG TRÌNH MẪU

#include <stdio.h>#include <conio.h>#include <iostream.h>#define FileIn "Bai4.inp"int Dem = 0; //Dếm số đườ ng điint*L; //Lưu lại đườ ng đã đichar*DanhDau; //Đánh dấu đỉnh đã đi

int **A,n,D,C;/*Dọc file dữ liệu theo yêu cầu của chươ ng trình*/void Doc_File(){

FILE*f = fopen(FileIn,"rb");fscanf(f,"%d%d%d",&n,&D,&C);cout<<"Ma Tran Lien Ket Tuong Ung.\n";cout<<D<<" "<<C<<endl;*A = new int [n];for(int i =0;i<n;i++) {

A[i] = new int [n];for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);cout<<A[i][j]<<" ";

}cout<<endl;

}fclose(f);D--;

C--;}/*Khở i tạo các tham số ban đầu cho chươ ng trình*/void KhoiTao() {

DanhDau = new char [n];L = new int [n];for (int i = 0; i<n; i++) { //Tất cả các đỉnh chưa đượ c đánh dấu

DanhDau[i] = 0;L[i] = 0;

}

 Biên Soạn: Đào Anh Pha Trang 23

Page 25: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 25/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

DanhDau[D] = 1; //Đánh dấu đỉnh đầu tiênL[0] = D; //Lưu lại đỉnh đầu tiên là đỉnh xuất phát

}void InDuongDi(int SoCanh) {

Dem++;cout<<endl<<D+1;for (int i = 1; i<SoCanh; i++)

cout<<" -> "<<L[i]+1;}/*Thủ tục đệ quy tìm kiếm đườ ng đi*/void TimKiem(int SoCanh) {

if(L[SoCanh-1] == C) InDuongDi(SoCanh);else {

for(int i = 0; i<n; i++)if( A[L[SoCanh-1]][i]>0 && DanhDau[i] == 0){

L[SoCanh] = i;DanhDau[i] = 1;TimKiem(SoCanh+1); //Tìm kiếm đỉnh tiế p theoL[SoCanh] = 0;DanhDau[i] = 0;

}}

}/*Chươ ng trình chính*/void main() {

clrscr();Doc_File();KhoiTao();cout<<"Duong di tu "<<D+1<<" den "<<C+1;TimKiem(1);if(Dem==0)

cout<<" khong co";delete*A,DanhDau,L;getch();

}

 Biên Soạn: Đào Anh Pha Trang 24 

Page 26: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 26/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 5

M ột l ướ i giao thông hai chiề u giữ a n địa đ iể m đượ c cho bở i ma tr ận A[i,j] trong đ ó A[i,j]=1 nế u có đườ ng đ i t ừ i đế n j, còn A[i,j] = 0 trong tr ườ ng hợ  p ng ượ c l ại. M ột ng ườ i đư a thơ cần đ i qua t ấ t cả các con đườ ng này để phát thơ  , mỗ i đườ ng chỉ qua

một l ần. Hãy xác định một l ộ trình của ng ườ i đư a thơ này (có thể  t ồn t ại nhiề u l ộ trình khác nhau) hay thông báo không t ồn t ại đườ ng như vậ y.

 Dữ li ệ u vào: cho trong file Bai5.inp. -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ li ệ u ra: In ra màn hình đườ ng đ i của ng ườ i đư a thơ (nế u có).Ví dụ:

Bai5.inp K ết quả:5 1->2->3->4->2->5->40 1 0 0 01 0 1 1 10 1 0 1 00 1 1 0 10 1 0 1 0

Bai5.inp K ết quả:5 KHONG TON TAI DUONG DI 0 1 0 0 01 0 1 1 10 1 0 1 10 1 1 0 10 1 1 1 0

Bai5.inp K ết quả:5 2->1->5->4->2->3->40 1 0 0 11 0 1 1 00 1 0 1 0

0 1 1 0 11 0 0 1 0

HƯỚ NG DẪN THUẬT TOÁN Bài toán 5 chính là bài toán tìm đườ ng đi Euler. Điều kiện để có đườ ng đi

Euler là:-  Đồ thị liên thông.-  Đồ thị có không quá 2 đỉnh bậc lẻ. Nếu có 2 đỉnh bậc lẻ thì đỉnh xuất phát

tìm đườ ng đi phải là đỉnh bậc lẻ.

 Biên Soạn: Đào Anh Pha Trang 25

Page 27: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 27/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

Ý tưở ng thuật toán: S ử d ụng k  ỹ thuật xoá cạnh. Ngh ĩ a là, khi ta đi qua bất k ỳ cạnh nào ta phải xoá cạnh tươ ng ứng bằng cách gán tr ọng số đườ ng đi của cạnh mớ iđi qua bằng 0. Thuật toán k ết thúc khi ta đi qua tất cả các cạnh của đồ thị khi đó matr ận tr ận liên k ết của đồ thị bằng 0.

HƯỚ NG DẪN CÀI ĐẶT   Cài đặt hàm kiểm tra tính liên thông của đồ thị nếu liên thông tr ả về k ết quả 1

ngượ c lại tr ả về k ết quả 0.  Cài đặt hàm kiểm tra đồ thị có thỏa mãn tồn tại không quá 2 đỉnh bậc lẻ nếu

thỏa mãn tr ả về k ết quả 1 ngượ c lại tr ả về k ết quả 0. Nếu tồn tại đỉnh bậc lẻ thìđỉnh bậc lẻ chính là đỉnh xuất phát và trong quá trình kiểm tra chúng ta đếmluôn số cạnh của đồ thị. Bở i vì thuật toán k ết thúc khi ta đi hết tất cả mọi cảnhcủa đồ thị.

  Cài đặt thuật toán tìm đườ ng đi Euler: tr ướ c tiên kiểm tra xem đồ thị co thỏamãn điều kiện tồn tại đườ ng đi Euler hay chưa nếu không thỏa mãn thì thuậttoán k ết thúc. Ngượ c lại ta tìm đườ ng đi Euler như sau:-  Chọn đỉnh xuất phát: nếu tồn tại đỉnh bậc lẻ thì chọn đỉnh bậc lẻ làm đỉnh

xuất phát, nếu không tồn tại đỉnh bậc lẻ thì chọn 1 đỉnh bất k ỳ thôngthườ ng ta chọn đỉnh 1 làm đỉnh xuất phát.

-  Từ đỉnh xuất phát ta đi tớ i đỉnh k ề nó và xóa cạnh tươ ng ứng. Nếu j là đỉnhk ề vớ i đỉnh xuất phát thì A[xuất phát][j]= A[j][xuất phát] = 0 và đỉnh xuất

 phát ta gán bằng đỉnh j. Lặ p lại cho đến khi không còn đi đượ c nữa (đi quamọi cạnh của đồ thị) thì thuật toán k ết thúc.

CHƯƠ NG TRÌNH MẪU 

#include <stdio.h>#include <conio.h>#include <iostream.h>#include <values.h>#define TenFile "Bai5.inp"/*Dọc dữ liệu của bài toán*/void Doc_File(int **A,int &n) { 

FILE*f = fopen(TenFile,"rb");fscanf(f,"%d",&n);*A = new int [n];cout<<"Ma Tran Lien Ket Cua Do Thi";for(int i =0;i<n;i++) {

A[i] = new int [n];cout<<endl;for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);

 Biên Soạn: Đào Anh Pha Trang 26 

Page 28: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 28/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

cout<<" "<<A[i][j];}

}fclose(f);

}/*Kiểm tra tính liên thông của đồ thị.Đồ thị liên thông thì hàm tr ả về giá tr ị 1, ngượ c lại hàm tr ả về giá tr ị 0.*/char LienThong(int **A,int n) { 

char*DanhDau = new char [n];char ThanhCong;int Dem=0;for(int i = 0; i<n; i++)

DanhDau[i] = 0;

DanhDau[0] = 1;Dem++;do {ThanhCong =1;for(i = 0; i<n; i++)if(DanhDau[i]==1) {

for(int j = 0; j<n; j++)if (DanhDau[j] == 0 && A[i][j] > 0) {

DanhDau[j] = 1;

ThanhCong =0;Dem++;if(Dem == n) return 1;

}}}while (ThanhCong == 0);return 0;

}/*Kiểm tra đồ thị có quá 2 đỉnh bậc lẻ hay không.

 Nếu quá 2 đỉnh bậc lẻ hàm tr ả về giá tr ị 0, ngượ c lại hàm tr ả về giá tr ị 1.Tìm đỉnh xuất phát lưu trong biến XP và tổng số cạnh lưu trong biến Canh*/char KiemTraBacLe(int**A, int n,int &XP, int &Canh) { 

int BacDinh,BacLe=0;Canh = 0;XP = 0;for(int i = n-1; i>=0; i--) {

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

if(A[i][j]>0)BacDinh++;

 Biên Soạn: Đào Anh Pha Trang 27 

Page 29: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 29/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

if(BacDinh%2==1) {XP= i;

BacLe++;}

Canh+=BacDinh;}Canh = Canh/2;if(BacLe>2) return 0;else return 1;

}/*Tim mot duong di Euler*/void Euler(int**A,int n){ 

int XuatPhat,SoCanh,Dem;

int *LuuDuong;if(LienThong(A,n)==1 && KiemTraBacLe(A,n,XuatPhat,SoCanh)==1){

LuuDuong = new int[SoCanh+1];LuuDuong[0] = XuatPhat;Dem = 1;do{

int j = 0;while(A[XuatPhat][j]==0)

 j++;

A[XuatPhat][j] = A[j][XuatPhat] = 0;LuuDuong[Dem] = XuatPhat = j;Dem++;

}while(Dem<=SoCanh);cout<<"\nDuong Di Cua Nguoi Dua Tho:\n"<<LuuDuong[0]+1;for(int i = 1; i<=SoCanh; i++)

cout<<" -> "<<LuuDuong[i]+1;}else

cout<<"\nKhong ton tai duong di.";

}/*Chươ ng trình chính*/void main() { 

clrscr();int **A,n;Doc_File(A,n);Euler(A,n);delete*A;getch();

}

 Biên Soạn: Đào Anh Pha Trang 28

Page 30: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 30/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

CẢI TIẾN THUẬT TOÁN XỬ LÝ CÁC TR ƯỜ NG HỢ P ĐẶC BIỆT1.  Tr ườ ng hợ  p đồ th ị có 2 đỉ nh bậc l ẻ trong đ ó có 1đỉ nh bậc 1.

Xét đồ thị:

 Nếu chúng ta xuất phát từ đỉnh 4. Khi chúng ta đi 4->2->1 đồ thị của ta sẽ tươ ng ứng vớ i thuật toán xoá cạnh là:

Khi đó điểm xuất phát của ta sẽ bắt đầu từ đỉnh 1, tại đỉnh này chúng ta sẽ không còn đườ ng đi nữa vì nó là đỉnh cô lậ p. Để khắc phục đượ c hiện tr ạng nàychúng ta phải chọn ưu tiên đỉnh xuất phát là đỉnh có bậc 1 và đỉnh k ết thúc sẽ là đỉnh

 bậc lẻ còn lại.Bai5.inp K ết quả:6 4->2->5->1->3->5->6->20 0 1 0 1 0

0 0 0 1 1 11 0 0 0 1 00 1 0 0 0 01 1 1 0 0 10 1 0 0 1 0

 Hàm cải tiế n kiể m tra đỉ nh bậc l ẻ và chon đỉ nh xuấ t phát.

char KiemTraBacLe(int**A, int n,int &XP, int &Canh) { int BacDinh,BacLe=0,T=0;Canh = XP = 0;

for(int i = 0; i<n; i++) {BacDinh = 0;for(int j = 0; j<n; j++)if(A[i][j]>0)

BacDinh++;if(BacDinh%2==1) {

if(BacDinh==1) {T = 1;XP= i;

}

 Biên Soạn: Đào Anh Pha Trang 29

Page 31: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 31/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

if(T = 0)XP = i;

BacLe++;}

Canh+=BacDinh;}Canh = Canh/2;if(BacLe>2) return 0;else return 1;

}

2.  Tr ườ ng hợ  p đồ th ị có 2 đỉ nh bậc l ẻ trong đ ó có 2 đỉ nh bậc 1.

Xử lý tươ ng tự như tr ườ ng hợ  p 1 nhưng ta phải lưu vết đườ ng đi đã đi qua để tránh tr ườ ng hợ  p đườ ng đi sau khi xóa thì đỉnh tươ ng ứng xuất phát là đỉnh cô lậ p. Cónhiều cách để lưu vết, tìm kiếm bằng phươ ng pháp đệ quy là một trong những cánhlưu vết hiệu quả và đơ n giản. Tuy nhiên đồ phức tạ p của thuật toán quá lớ n nên trongthực tế ngườ i ta ích sử dụng phươ ng pháp này.

3.   K  ỹ thuật tìm ki ế m đệ quy tìm đườ ng đ i Euler.

#include <stdio.h>#include <conio.h>#include <iostream.h>

#define Filename "Bai5.inp"/*Khai báo các biến toàn cục*/int Dem = 0; //Đếm số đườ ng điint*L; //Lưu lại đỉnh đã điint **A,nint XuatPhat=0; //Đỉnh xuẩt phát tìm kiếm là đỉnh bậc lẻ nếu đồ thị có đỉnh bậc lẻ int SoCanh=0; //Lưu số cạnh của đồ thị vì đườ ng đi đi qua tất cả các cạnh/*Dọc file dữ liệu và khở i tạo ban đầu*/void Doc_File(){ 

int BacDinh;FILE*f = fopen(Filename,"rb");fscanf(f,"%d",&n);cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<n<<endl;*A = new int [n];for(int i =0;i<n;i++) {

A[i] = new int [n];BacDinh = 0;for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);cout<<A[i][j]<<" ";

 Biên Soạn: Đào Anh Pha Trang 30

Page 32: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 32/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

if(A[i][j] == 1) BacDinh++;}if(BacDinh%2==1) XuatPhat = i; //Xuẩt phát là đỉnh bậc lẻ SoCanh+=BacDinh;

cout<<endl;}fclose(f);SoCanh = SoCanh/2; //Số cạnh = tổng bậc /2L = new int [SoCanh+1]; //Khở i tạo lưu đỉnhL[0] = XuatPhat;

}/*Xuất đườ ng đi tìm đượ c ra màn hình*/void InDuongDi() { 

Dem++;cout<<endl<<XuatPhat+1;for (int i = 1; i<=SoCanh; i++)

cout<<" -> "<<L[i]+1;}/*Thủ tục tìm kiếm đệ quy*/void TimKiem(int Canh) {

/*Tìm cho đến khi cạnh tìm đượ c lớ n hơ n số cạnh của đồ thị mớ i xuất đườ ng đi*/if(Canh > SoCanh && Dem ==0 ) InDuongDi();

else {for(int i = 0; i<n; i++)if( A[L[Canh-1]][i]>0 && Dem==0){

L[Canh] = i;A[L[Canh-1]][i]=A[i][L[Canh-1]]=0; //Xóa cạnhTimKiem(Canh+1); //Tìm đỉnh tiế p theoA[L[Canh-1]][i]=A[i][L[Canh-1]]=1; //Phục hồi cạnhL[Canh] = 0;

}

}}void main() { 

Doc_File();cout<<"\nDUONG DI";TimKiem(1);if(Dem==0)

cout<<" KHONG CO";delete*A,L;

getch();}

 Biên Soạn: Đào Anh Pha Trang 31

Page 33: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 33/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 6

M ột ng ườ i khách du l ịch muố n đ i thă m n thành phố  đượ c đ ánh số  t ừ 1 đế n n, mỗ ithành phố ng ườ i khách chỉ muố n đ i qua chúng một l ần. M ạng l ướ i giao thông giữ a nthành phố  là hai chiề u và đượ c cho bở i ma tr ận A[i,j] trong đ ó A[i,j] =1 nế u có

đườ ng đ i giữ a thành phố i và thành phố j, A[i,j] = 0 trong tr ườ ng hợ  p ng ượ c l ại. Hãy viế t chươ ng trình thiế t l ậ p cho ng ườ i khách một l ộ trình (có thể  t ồn t ại

nhiề u l ộ trình) hay thông báo không t ồn t ại l ộ trình theo yêu cầu của khách. Dữ li ệ u vào: cho trong file Bai6.inp 

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng 2 ghi đỉ nh mà ng ườ i khách du l ịch xuấ t phát.-   Dòng i+1 (   ) chứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ li ệ u ra: In ra màn hình đườ ng đ i của ng ườ i khách (nế u có).Ví dụ:Bai6.inp K ết quả:5 1->2->3->4->510 1 0 0 01 0 1 1 10 1 0 1 00 1 1 0 1

0 1 0 1 0Bai6.inp K ết quả:6 KHONG TON TAI DUONG DI10 1 1 0 0 01 0 1 0 1 01 1 0 0 0 10 0 0 0 1 00 1 0 1 0 00 0 1 0 0 0

Bai6.inp K ết quả:5 2->1->5->4->320 1 0 1 11 0 1 0 10 1 0 1 01 0 1 0 11 1 0 1 0

 Biên Soạn: Đào Anh Pha Trang 32

Page 34: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 34/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

Bai6.inp K ết quả:6 KHONG TON TAI DUONG DI10 1 1 0 0 01 0 1 0 0 01 1 0 0 0 00 0 0 0 1 10 0 0 1 0 10 0 0 1 1 0

HƯỚ NG DẪN THUẬT TOÁNS ử d ụng k  ỹ thuật tìm kiế m theo chiề u sâu.

HƯỚ NG DẪN CÀI ĐẶTS ử d ụng k  ỹ thuật cài đặ t tìm kiế m theo phươ ng pháp đệ quy.

CHƯƠ NG TRÌNH MẪU

#include <stdio.h>#include <conio.h>#include <iostream.h>#define FileIn "Bai6.inp"int Dem = 0; //Dếm số đườ ng điint*L; //Lưu lại đườ ng đichar*DanhDau; //Dánh dấu đỉnh đã đi

int **A,n,D;/*Dọc file dữ liệu bài toán*/void Doc_File() { 

FILE*f = fopen(FileIn,"rb");fscanf(f,"%d%d",&n,&D);cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<endl;*A = new int [n];for(int i =0;i<n;i++) {

A[i] = new int [n];

for(int j =0;j<n;j++) {fscanf(f,"%d",&A[i][j]);cout<<A[i][j]<<" ";

}cout<<endl;

}fclose(f);D--;

}

/*Khở i tạo dữ liệu ban đầu cho bài toán*/void KhoiTao() { 

 Biên Soạn: Đào Anh Pha Trang 33

Page 35: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 35/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

DanhDau = new char [n];L = new int [n];for (int i = 0; i<n; i++) {

DanhDau[i] = 0;

L[i] = 0;}DanhDau[D] = 1;L[0] = D;

}/*In đườ ng đi của bài toán ra màn hình*/void InDuongDi(int Dinh) { 

Dem++;cout<<endl<<D+1;

for (int i = 1; i<Dinh; i++)cout<<" -> "<<L[i]+1;

}/*Tìm kiếm đườ ng đi*/void TimKiem(int Dinh) { 

if(Dinh == n && Dem == 0) InDuongDi(Dinh);else {

for(int i = 0; i<n; i++)if( A[L[Dinh-1]][i]>0 && DanhDau[i] == 0 && Dem==0){

L[Dinh] = i;DanhDau[i] = 1;TimKiem(Dinh+1); //Tiếm kiếm đỉnh k ế tiế pL[Dinh] = 0;DanhDau[i] = 0;

}}

}/*Chươ ng trình chính*/

void main() { clrscr();Doc_File();KhoiTao();cout<<"Duong Di Nguoi Khach";TimKiem(1); //Tìm kiếm từ đỉnh thứ 2 của đồ thị if(Dem==0)

cout<<" Khong Co";delete*A,DanhDau,L;

getch();}

 Biên Soạn: Đào Anh Pha Trang 34 

Page 36: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 36/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 7

Có n thành phố  biế t r ằ ng  đườ ng  đ i giữ a các thành phố  (nế u có) là đườ ng  đ i haichiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận A[i,j] trong đ ó:

-   A[i,j] là độ dài đườ ng đ i t ừ thành phố i đế n thành phố j.

-   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j.-   A[i,j] = A[j,i]-   A[i,j] nguyên, không âm.

 Hãy xác định đườ ng đ i ng ắ n nhấ t t ừ thành phố   D đế n thành phố  C . Dữ li ệ u vào: đồ thị đ ã liên thông và cho trong file Bai7.inp vớ i nội dung 

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C.-   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.

ni ≤≤1

 Dữ li ệ u ra: xuấ t ra màn hình đườ ng đ i ng ắ n nhấ t t ừ  đỉ nh D đế n C và giá tr ị đườ ng đ ing ắ n nhẩ t tìm đượ c. Ví dụ: Bai7.inp K ết quả:6 DUONG DI NGAN NHAT LA: 51 6 1->2->4->60 1 2 0 0 01 0 2 2 3 0

2 2 0 5 4 00 2 5 0 3 20 3 4 3 0 40 0 0 2 4 0

Bai7.inpK ết quả:

6 DUONG DI NGAN NHAT LA: 8

1 6 1->2->4->6

0 1 4 0 0 01 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

HƯỚ NG DẪN THUẬT TOÁNS ử d ụng thuật toán DIJKSTRA tìm đườ ng đ i ng ắ n nhấ t.

 Biên Soạn: Đào Anh Pha Trang 35

Page 37: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 37/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

CHƯƠ NG TRÌNH MẪU

#include <stdio.h>

#include <conio.h>

#include <iostream.h>#include <values.h>

#define FileIn "Bai7.inp"

/*Đọc file dữ liệu bài toán*/

void Doc_File(int**A, int &n, int &D, int &C){ 

FILE*f = fopen(FileIn,"rb");

fscanf(f,"%d%d%d",&n,&D,&C);

cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<" "<<C<<endl;

*A = new int [n];

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

A[i] = new int [n];

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

fscanf(f,"%d",&A[i][j]);

cout<<A[i][j]<<" ";

}

cout<<endl;

}

fclose(f);

D--; C--;

}

/*Thuật toán Dijkstra tìm đườ ng đi ngắn nhẩt từ đỉnh D đến đỉnh C*/

void Dijkstra(int **A, int n, int D, int C) { 

char *DanhDau = new char[n];int *Nhan = new int[n];

int *Truoc = new int[n];

int XP, min;

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

 Nhan[i] = MAXINT;

DanhDau[i] = 0;

Truoc[i] = D;}

 Biên Soạn: Đào Anh Pha Trang 36 

Page 38: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 38/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

 Nhan[D] = 0;

DanhDau[D] = 1;

XP = D;

while(XP != C){

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

if(A[XP][j]>0 && Nhan[j]>A[XP][j]+Nhan[XP] && DanhDau[j]==0) {

 Nhan[j] = A[XP][j]+Nhan[XP];

Truoc[j] = XP;

}

min = MAXINT;

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

if(min>Nhan[j]&& DanhDau[j]==0){

min = Nhan[j] ;

XP = j ;

}

DanhDau[XP] = 1;

}

cout<<”Duong Di Ngan Nhat La:”<<Nhan[C]<<endl;

cout<<C+1<<” <- “<<Truoc[C]+1;

i = Truoc[C];

while(i!=D){

i = Truoc[i];

cout<<” <- “<<i+1;

}

}

/*Chươ ng trình chính*/void main() { 

int**A,n,Dau,Cuoi;

Doc_File(A,n,Dau,Cuoi);

Dijkstra(A,n,Dau,Cuoi);

delete*A;

getch();

}

 Biên Soạn: Đào Anh Pha Trang 37 

Page 39: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 39/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 8

M ột công ty cần thay toàn bộ hệ thố ng dây đ iện cho n phòng làm việc. Cho biế t sơ  đồ đ iện hiện có của n că n phòng này đượ c biề u diễ n bằ ng ma tr ận A[i,j] trong đ ó:

-   A[i,j]=A[j,i] chính là chiề u dài dây đ iện nố i liề n giữ a hai phòng i và j.

-   A[i,j] = A[j,i] = 0 nế u i không nố i liề n vớ i j. Hãy l ậ p trình tính độ dài cuả dây d ẫ n cần sử d ụng sao cho cả n phòng đ iề u có

đ iện và số l ượ ng này là ít nhấ t.Chú ý: đồ thị đ ã cho là liên thông.

 Dữ li ệ u vào: cho trong file Bai8.inp ( đồ thị cho đ ã liên thông).-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)

-   Dòng i+1 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở imột khoảng tr ắ ng.

ni ≤≤1

 Dữ li ệ u ra: l ư u trong file Bai8.out vớ i nội dung sau:-   Dòng đầu l ư u độ dài dây d ẫ n nhỏ nhấ t -  Các dòng còn l ại l ư u đườ ng đ i cần nố i đ iện giữ a đỉ nh i nố i vớ i đỉ nh j có

tr ọng số A[i,j] (i -> j = A[i][j]).

Bai8.inp Bai8.out50 3 3 2 23 0 2 3 8

3 2 0 1 42 3 1 0 42 8 4 4 0

74 – 33 – 2

4 – 11 – 5

Bai8.inp Bai8.out80 2 3 4 0 0 0 02 0 3 0 4 0 0 03 3 0 7 6 5 2 04 0 7 0 0 0 3 00 4 6 0 0 4 0 8

0 0 5 0 4 0 1 60 0 2 3 0 1 0 50 0 0 0 8 6 5 0

201 - 21 - 33 - 77 - 67 - 4

2 - 57 - 8

HƯỚ NG DẪN THUẬT TOÁN

  Thuật toán Prim tìm cây phủ tối tiểu.  Thuật toán Kruskal tìm cây phủ tối tiểu.

1)  Thuật toán Prim tìm cây phủ t ố i ti ể u.

 Bướ c 1: Xuất phát từ đỉnh k bất k ỳ (thông thườ ng chon k là đỉnh đầu tiên) chọn mộtcạnh có tr ọng số nhỏ nhất của đồ thị (min{A[k][j]} j=1..n) ta đánh dấu 2 đỉnh đi qua cạnh

 Biên Soạn: Đào Anh Pha Trang 38

Page 40: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 40/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

đó và số cạnh tìm đượ c là 1. Chuyển sang bướ c 2. Bướ c 2: 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 đỉnhchưa đánh dấu và 1 đỉnh đã đánh dấu (min{A[i][j]} j=1..n, i=1..n sao cho i đánh đấu và jchưa đánh dấu) để tránh tr ườ ng hợ  p tạo thành chu trình. Ta tăng số cạnh tìm đượ c lên

1 và chuyển sang bướ c 3. Bướ c 3: Nếu số cạnh tìm đượ c bằng n-1 k ết thúc thuật toán, ngượ c lại quay về bướ c 2.

2)  Thuật toán Kruskal tìm cây phủ t ố i ti ể u.

 Bướ c 0: Khở i tạo tậ p cạnh tìm đượ c là r ỗng. Chuyển sang bướ c 1. Bướ c 1: Chọn một cạnh có tr ọng số nhỏ nhất sao cho khi đưa cạnh này vào tậ p cạnh tìmđượ c không tạo thành chu trình. Tăng số cạnh tìm đượ c lên 1và chuyển sang bướ c 2.

 Bướ c 2: Nếu số cạnh tìm đượ c bằng n-1 thuật toán k ết thúc, ngượ c lại quay về bướ c 1.

HƯỚ NG DẪN CÀI ĐẶT1)  Thuật toán Prim tìm cây phủ t ố i ti ể u.

Ta tổ chức mảng 1 chiều D để đánh dấu . Nếu D[i]=1 đỉnh i đượ c đánh dấu vàD[i]=0 nếu i chưa đượ c đánh dấu.

 Bướ c 1: Tìm min{A[i][j]} j=1..n, i=1..n. Sau đó gán D[i]=D[j]=1 (đánh dấu 2 đỉnh i,j) vàcho số cạnh tìm đượ c bằng 1 (Dem=1).

 Bướ c 2: Tìm min{A[i][j]} j=1..n, i=1..n vớ i điều kiện D[i]=1 và D[j]=0. Sau đó gánD[j]=1 (đánh dấu đỉnh j vừa tìm đượ c) và tăng số cạnh lên 1 (Dem++).

 Bướ c 3: Nếu Dem = n-1 thì thuật toán k ết thúc.

2)  Thuật toán Kruskal tìm cây phủ t ố i ti ể u.

Ta tổ chức mảng 1 chiều D để đánh dấu . Nếu D[i]=T thì đỉnh i thuộc vào cây thứ T, D[i] = 0 thì đỉnh i chưa thuộc vào cây.

 Bướ c 1: Tìm min{A[i][j]} j=1..n, i=1..n ngoại tr ừ điều kiện D[i]=D[j]≠0. Vì khi thỏa mãn

điều kiện trên đỉnh i,j đã thuộc vào một cây do đó khi lấy thêm cạnh này chúng sẽ tạothành chu trình. Đỉnh i,j tìm đượ c thoả mãn một trong các tr ườ ng hợ  p sau:

-   Nếu D[i]=D[j]=0, đỉnh i,j chưa thuộc vào cây nên khi lấy 2 đỉnh này vào tậ pcạnh ta cho chúng thuộc vào 1 cây mớ i. Ngh ĩ a là số cây T++ và

D[i]=D[j]=T.-   Nếu D[i]=0 và D[j]≠0, đỉnh i chưa thuộc vào cây và j đã thuộc vào cây. Ta

lấy đỉnh i vào cây tươ ng ứng vớ i cây của đỉnh j. Ngh ĩ a là gán D[i]=D[j].

-   Nếu D[i]≠0 và D[j]=0, đỉnh j chưa thuộc vào cây và i đã thuộc vào cây. Talấy đỉnh j vào cây tươ ng ứng vớ i cây của đỉnh i. Ngh ĩ a là gán D[j]=D[i].

-   Nếu D[i]≠D[j] và D[i]≠0 và D[j]≠0, đỉnh i thuộc vào cây và đỉnh j cũng

thuộc vào cây nhưng cây i và j là 2 cây khác nhau. Ta tiến hành ghép câyngh ĩ a là ghép 2 cây chứa i,j thành 1 cây mớ i. 

Temp = D[i]for(int i=0 ; i<n ; i++)

 Biên Soạn: Đào Anh Pha Trang 39

Page 41: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 41/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

if(D[i]==Temp) D[i]=D[j]Tăng số cạnh tìm đượ c lên 1 (Dem++).

Bướ c 2: Nếu Dem = n-1 thì thuật toán k ết thúc.Chú ý: trong qua trình tìm có thể  t ạo thành r ấ t nhiề u cây như ng k ế t quả tìm đượ c

cuố i cùng là một cây thông qua quá trình ghép cây.CHƯƠ NG TRÌNH MẪU

1)  Thuật toán Prim tìm cây phủ t ố i ti ể u.

#include <stdio.h>#include <conio.h>#include <iostream.h>#include <values.h>#define FileInt "Bai8.inp"#define FileOut "Bai8.out"

 /*Lư u l ại nhữ ng cạnh đ ã đ i qua x->y*/ typedef struct Egde {

int x,y;};

 /*Doc d ữ liệu t ừ file*/ void Doc_File(int **A,int &n){

FILE*f = fopen(FileInt,"rb");fscanf(f,"%d",&n);*A = new int [n];for(int i =0;i<n;i++) {

A[i] = new int [n];for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);}

}fclose(f);

} /*Ghi d ữ liệu ra file*/ void Ghi_File(Egde*L,int n,int Sum) {

FILE*f = fopen(FileOut,"wb");fprintf(f,"%d\n",Sum);for(int i =0; i<n-1; i++)

fprintf(f,"%d - %d\n",L[i].x+1,L[i].y+1);fclose(f);

} /*Thuật toán Prim*/ 

 Biên Soạn: Đào Anh Pha Trang 40

Page 42: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 42/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

void Prim(int **A, int n){char *D = new char[n]; /*Dánh dấu đỉnh*/Egde *L = new Egde[n-1]; /*Lưu đườ ng đi */int min = MAXINT, Dem = 0, Sum = 0;

 /*Khoi t ạo giá tr ị cho mảng đ ánh d ấ u*/ for(int i=0; i<n; i++)D[i]=0;

 /*Tìm cạnh nhỏ nhấ t đầu tiên xuấ t phát t ừ  đỉ nh 1*/ for(int j=1; j<n; j++)if(min>A[0][j] && A[0][j]!=0){

min = A[0][j];L[0].y = j;

}

L[0].x = 0;D[0] = D[L[0].y] = 1;Sum+=min;Dem++;

 /*Thự c hiện cho đế n khi số cạnh tìm đượ c là n-1 cạnh*/ do{

min = MAXINT;for( i=0; i<n; i++)if(D[i]==1)

for( j=0; j<n; j++)if(A[i][j]>0 && min>A[i][j] && D[j]==0){

min = A[i][j];L[Dem].x = i;L[Dem].y = j;

}Sum+=min;D[L[Dem].y] = 1;Dem++;

} while(Dem<n-1);Ghi_File(L,n,Sum); /*Ghi k ế t quả tìm đượ c vào file*/ 

} /*Chươ ng trình chính*/ void main() {

int **A,n;Doc_File(A,n);Prim(A,n);delete *A;

}

 Biên Soạn: Đào Anh Pha Trang 41

Page 43: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 43/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

2)  Thuật toán Kruskal tìm cây phủ t ố i ti ể u.

void Kruskal(int **A, int n){char *D = new char[n];Egde *L = new Egde[n-1];

int min, Dem = 0, Sum = 0, T = 0, Temp;for(int i=0; i<n; i++)

D[i] = 0;do{

min = MAXINT;for( i=0; i<n; i++)for(int j=0; j<n; j++)if(A[i][j]>0 && min>A[i][j]&& !(D[i]!=0 && D[i]==D[j])) {

min = A[i][j];

L[Dem].x = i;L[Dem].y = j;

}/*Tạo ra cây mớ i*/if(D[L[Dem].x] ==0 && D[L[Dem].y] == 0){

T++;D[L[Dem].x] = D[L[Dem].y] = T;

}/*Đưa đỉnh tươ ng ứng vào cây*/

if(D[L[Dem].x] == 0 && D[L[Dem].y] != 0)D[L[Dem].x] = D[L[Dem].y];

/*Đưa đỉnh tươ ng ứng vào cây*/if(D[L[Dem].x] != 0 && D[L[Dem].y] == 0)

D[L[Dem].y] = D[L[Dem].x];/*Ghép 2 cây thành 1 cây mớ i*/if(D[L[Dem].x] != D[L[Dem].y] && D[L[Dem].y]!=0) {

Temp = D[L[Dem].x];for( i=0; i<n; i++)

if(Temp==D[i])D[i]=D[L[Dem].y];

}Sum+=min;Dem++;

} while(Dem<n-1);Ghi_File(L,n,Sum);

}

 Biên Soạn: Đào Anh Pha Trang 42

Page 44: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 44/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 9

Có n thành phố  đượ c đ ánh số t ừ 1 đế n n. M ạng l ướ i giao thông giữ a các thành phố làđườ ng hai chiề u. Trên đườ ng đ i (nế u có) t ừ  thành phố  i đế n thành phố  j, ng ườ i takhông đượ c mang quá A[i,j] đơ n vị hàng. N ế u không có đườ ng đ i t ừ thành phố i đế n

thành phố j thì xem như A[i,j] = 0. C ần vận chuyể n hàng t ừ thành phố   D đế n thành phố  C . Hãy thiế t l ậ p k ế hoạch vận chuyể n sao cho khố i l ượ ng hàng vận chuyể n lànhiề u nhấ t.

 Dữ li ệ u vào: đồ thị đ ã liên thông và cho trong file Bai9.inp vớ i nội dung -   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C.-   Dòng i+2 (   ) chứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở i

một khoảng tr ắ ng.ni ≤≤1

 Dữ li ệ u ra: xuấ t ra màn hình k ế hoạch vận chuyể n t ừ  đỉ nh D đế n C và giá tr ị đườ ng đ i ng ắ n nhẩ t tìm đượ c. Ví dụ: Bai9.inp K ết quả:6 KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 2

1 6 1->3->4->60 1 2 0 0 01 0 2 2 3 02 2 0 5 4 0

0 2 5 0 3 20 3 4 3 0 40 0 0 2 4 0

Bai9.inpK ết quả:

6 KHOI LUONG VAN CHUYEN NHIEU NHAT LA: 3

1 6 1->3->4->2->5->60 1 4 0 0 0

1 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

 Biên Soạn: Đào Anh Pha Trang 43

Page 45: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 45/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN THUẬT TOÁNS ử d ụng phươ ng pháp t ố i ư u theo t ừ ng đỉ nh giố ng thuật toán DIJKSTRA.

HƯỚ NG DẪN CÀI ĐẶT

 Khở i t ạo:

-  Mọi nhãn ban đầu bằng vô cùng.

-  Tất cả các đỉnh chưa đượ c đánh dấu

-  Tr ướ c mọi đỉnh là đỉnh đầu.

-  Đánh dấu đỉnh xuất phát.

 Xét đỉ nh xuấ t phát là đỉ nh XP:

-   Nếu A[XP][j]>0, j chưa đượ c đánh dấu và Nhan[j] = vô cùng thì:

 Nhan[j] = min{Nhan[XP],A[XP][j]}Truoc[j] = XP

-   Nếu A[XP][j]>0, j chưa đượ c đánh dấu, Nhan[j] khác vô cùng vàmin{Nhan[XP],A[XP][j]}>Nhan[j] thì:

 Nhan[j] = min{Nhan[XP],A[XP][j]}

Tr ướ c[j] = XP

 Xét đỉ nh xuấ t phát tiế  p theo:

Đỉnh xuất phát tiế p theo là đỉnh chưa đượ c đánh dấu và nhãn của đỉnh phải lớ nnhất nhưng khác vô cùng. Khi chọn đượ c đỉnh xuất phát ta phải đánh dấu đỉnh XP.

 Minh họa thuật toán: Xét đồ thị d ướ i đ ây, hãy l ậ p k ế hoạch vận chuyể n hàng nhiề unhấ t t ừ  đỉ nh 1 đế n đỉ nh 6.

 Khở i t ạo:

Đỉnh 1 2 3 4 5 6

Nhãn ∞  ∞  ∞  ∞  ∞  ∞ 

Đánh dấu 1* 0 0 0 0 0

Trướ c 1 1 1 1 1 1

 Biên Soạn: Đào Anh Pha Trang 44 

Page 46: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 46/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

-   Xuấ t phát là đỉ nh 1: dánh d ấ u đỉ nh 1.

Đỉnh 1 2 3 4 5 6

Nhãn ∞ 1 2 ∞  ∞  ∞ 

Đánh dấu 1* 0 0 0 0 0Trướ c 1 1 1 1 1 1

-   Xuấ t phát là đỉ nh 3: đ ánh d ấ u đỉ nh 3 ( đỉ nh 3 là đỉ nh có nhãn l ớ n nhấ t khácvô cùng và chư a đượ c đ ánh d ấ u).

Đỉnh 1 2 3 4 5 6

Nhãn ∞ 2 2 2 2 ∞ 

Đánh dấu 1 0 1* 0 0 0

Trướ c 1 3 1 3 3 1-   Xuấ t phát là đỉ nh 2: đ ánh d ấ u đỉ nh 2 ( đỉ nh 2 là đỉ nh có nhãn l ớ n nhấ t khác

vô cùng và chư a đượ c đ ánh d ấ u).

Đỉnh 1 2 3 4 5 6

Nhãn ∞ 2 2 2 2 ∞ 

Đánh dấu 1 1* 1 0 0 0

Trướ c 1 3 1 3 3 1

-   Xuấ t phát là đỉ nh 4: đ ánh d ấ u đỉ nh 4 ( đỉ nh 4 là đỉ nh có nhãn l ớ n nhấ t khácvô cùng và chư a đượ c đ ánh d ấ u).

Đỉnh 1 2 3 4 5 6

Nhãn ∞ 2 2 2 2 2

Đánh dấu 1 1 1 1* 0 0

Trướ c 1 3 1 3 3 4

-   Xuấ t phát là đỉ nh 5: đ ánh d ấ u đỉ nh 5 ( đỉ nh 5 là đỉ nh có nhãn l ớ n nhấ t khác

vô cùng và chư a đượ c đ ánh d ấ u).

Đỉnh 1 2 3 4 5 6

Nhãn ∞ 2 2 2 2 2

Đánh dấu 1 1 1 1 1* 0

Trướ c 1 3 1 3 3 4

-   Xuấ t phát là đỉ nh 6: đ ánh d ấ u đỉ nh 6. Đỉ nh xuấ t phát bằ ng đỉ nh đ i đế n nênthuật toán k ế t thúc và tr ọng t ải l ớ n nhấ t là 2, k ế hoạch vận chuyể n qua các

con đườ ng là: 6 — 4 — 3 — 1.

 Biên Soạn: Đào Anh Pha Trang 45

Page 47: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 47/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

CHƯƠ NG TRÌNH MẪU

#include <stdio.h>#include <conio.h>#include <iostream.h>

#include <values.h>#define FileIn "Bai9.inp"/*Dọc file dữ liệu của bài tóan*/void Doc_File(int**A, int &n, int &D, int &C){ 

FILE*f = fopen(FileIn,"rb");fscanf(f,"%d%d%d",&n,&D,&C);cout<<"Ma Tran Lien Ket Tuong Ung.\n";cout<<D<<" "<<C<<endl;*A = new int [n];

for(int i =0;i<n;i++) {A[i] = new int [n];for(int j =0;j<n;j++) {

fscanf(f,"%d",&A[i][j]);cout<<A[i][j]<<" ";

}cout<<endl;

}fclose(f);

D--;C--;

}/*Thủ tục tìm đườ ng đi vận chuyển hàng nhiều nhất*/void VanChuyen(int **A, int n, int D, int C) { 

char *DanhDau = new char[n];int *Nhan = new int[n];int *Truoc = new int[n];int XP, min,max;

for(int i=0; i<n; i++){ Nhan[i] = MAXINT;DanhDau[i] = 0;Truoc[i] = D;

}DanhDau[D] = 1;XP = D;while(XP != C){

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

if(A[XP][j]>0&&DanhDau[j]==0){

 Biên Soạn: Đào Anh Pha Trang 46 

Page 48: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 48/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

if(Nhan[j]==MAXINT){if(Nhan[XP]>A[XP][j])

 Nhan[j] = A[XP][j];else Nhan[j] = Nhan[XP];

Truoc[j] = XP;}if(Nhan[j]!=MAXINT){

if(Nhan[XP]>A[XP][j])min = A[XP][j];

else min = Nhan[XP];if(Nhan[j]<min){

 Nhan[j] = min;Truoc[j] =XP;

}}

}max = 0;for(j=0; j<n; j++)if(Nhan[j]<MAXINT&&DanhDau[j]==0&&max<Nhan[j]){

max = Nhan[j];XP = j;

}

DanhDau[XP] = 1;}cout<<"Van chuyen nhieu nhat la: "<<Nhan[C];cout<<"\nCon duong van chuyen nhu sau:\n";cout<<C+1<<" <- "<<Truoc[C]+1;i = Truoc[C];while(i!=D){

i = Truoc[i];cout<<" <- "<<i+1;

}}/*Chươ ng trình chính*/void main() {

clrscr();int**A,n,Dau,Cuoi;Doc_File(A,n,Dau,Cuoi);VanChuyen(A,n,Dau,Cuoi);delete*A;

getch();}

 Biên Soạn: Đào Anh Pha Trang 47 

Page 49: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 49/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

BÀI TOÁN 10

Có n thành phố biế t r ằ ng đườ ng đ i giữ a các thành phố là đườ ng đ i hai chiề u. S ơ  đồ mạng l ướ i giao thông của n thành phố cho bở i ma tr ận A[i,j] trong đ ó:

-   A[i,j] là độ dài đườ ng đ i t ừ thành phố i đế n thành phố j.

-   A[i,j] = 0 nế u không có đườ ng đ i t ừ thành phố i đế n thành phố j.-   A[i,j] = A[j,i]-   A[i,j] nguyên, không âm.

 Hãy xác định đườ ng đ i dài nhấ t t ừ thành phố   D đế n thành phố  C vớ i đ iề u kiện thành phố  đ ã qua không đượ c đ i l ại. Dữ liệu vào:đồ thị đ ã liên thông và cho trong file Bai10.inp

-   Dòng đầu ghi số n là số  đỉ nh của một đồ thị (0<n<100)-   Dòng thứ hai l ư u đỉ nh D và đỉ nh C.

-   Dòng i+2 ( ) ch ứ a n số A[i,1],A[i,2]…A[i,n] mỗ i số cách nhau bở imột khoảng tr ắ ng.

ni ≤≤1

 Dữ liệu ra: xuấ t ra màn hình đườ ng đ i dài nhấ t t ừ  đỉ nh D đế n C và giá tr ị đườ ng đ ing ắ n nhẩ t tìm đượ c. 

Ví dụ: 

Bai10.inp K ết quả:6 DUONG DI DAI NHAT LA: 161 6 1->2->4->3->5->6 

0 1 2 0 0 01 0 2 2 3 02 2 0 5 4 00 2 5 0 3 20 3 4 3 0 40 0 0 2 4 0

Bai10.inp K ết quả:6 DUONG DI DAI NHAT LA: 25

1 6 1->3->4->2->5->6 0 1 4 0 0 01 0 2 6 5 04 2 0 7 3 00 6 7 0 0 10 5 3 0 0 30 0 0 1 3 0

HƯỚ NG DẪN THUẬT TOÁN

S ử d ụng k  ỹ thuật tìm kiế m theo chiề u sâu.

 Biên Soạn: Đào Anh Pha Trang 48

Page 50: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 50/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

HƯỚ NG DẪN CÀI ĐẶTS ử d ụng k  ỹ thuật cài đặ t tìm kiế m theo phươ ng pháp đệ quy, khi tìm đượ c 1

 phươ ng án thì l ư u l ại tr ạng thái của phươ ng án ban đầu và so sánh vớ i phươ ng ánmớ i tìm đượ c, nế u phươ ng án mớ i t ố t hơ n thì chọn phươ ng án mớ i.

CHƯƠ NG TRÌNH MẪU

include <stdio.h>#include <conio.h>#include <iostream.h>#define Filename "Bai10.inp"/*Khai báo các biến toàn cục*/int*L,*L1; //Luu lai duong da dichar*DanhDau; //Danh dau dinh da di

int **A,n,D,C,Tong,Tong1,Canh1;/*Dọc file dữ liệu của bài toán*/void Doc_File() { 

FILE*f = fopen(Filename,"rb");fscanf(f,"%d%d%d",&n,&D,&C);cout<<"Ma Tran Lien Ket Tuong Ung.\n"<<D<<" "<<C<<endl;*A = new int [n];for(int i =0;i<n;i++) {

A[i] = new int [n];

for(int j =0;j<n;j++) {fscanf(f,"%d",&A[i][j]);cout<<A[i][j]<<" ";

}cout<<endl;

}fclose(f);D--; C--;

}

/*Khở i tạo ban đầu cho thủ tục tìm kiếm*/void KhoiTao() { 

DanhDau = new char [n];L = new int [n]; //Lưu đườ ng đi tìm đượ cL1 = new int [n]; //Lưu đườ ng đi lớ n nhấtfor (int i = 0; i<n; i++) {

DanhDau[i] = 0; //Các đỉnh chưa đượ c đánh dấuL[i] = 0;

}

DanhDau[D] = 1; //Dánh dấu đỉnh xuẩt phátL[0] = D; //Đườ ng đi đầu tiên qua đỉnh đầu

 Biên Soạn: Đào Anh Pha Trang 49

Page 51: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 51/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

Tong = 0; //Trong số đườ ng điTong1 = 0; //Lưu lại tr ọng số lớ n nhất của đườ ng đi

}/*In đườ ng đi dài nhất tìm đượ c*/

void InDuongDi() { cout<<"\nDUONG DI DAI NHAT:"<<Tong1<<endl<<D+1;for (int i = 1; i<Canh1; i++)

cout<<" -> "<<L1[i]+1;}/*Xử lý để lấy phươ ng án tổt hơ n*/void XuLy(int Canh) { 

if(Tong>Tong1){Tong1 = Tong; //Lưu lại tr ọng số tốt hơ n

Canh1 = Canh; //Lưu lại số cạnh đã đi quafor(int i =0; i<Canh; i++)

L1[i] = L[i]; //Lưu lại đườ ng đi tốt hơ n}

}/*Thủ tục tìm kiếm đệ quy*/void TimKiem(int SoCanh) { 

if(L[SoCanh-1] == C) XuLy(SoCanh);else { for(int i = 0; i<n; i++)

if( A[L[SoCanh-1]][i]>0 && DanhDau[i] == 0){L[SoCanh] = i;DanhDau[i] = 1;Tong+=A[L[SoCanh-1]][i];TimKiem(SoCanh+1);L[SoCanh] = 0;Tong-=A[L[SoCanh-1]][i];DanhDau[i] = 0;

}

}}void main() {

Doc_File();KhoiTao();TimKiem(1);if(Tong1==0) cout<<"\NKHONG CO DUONG DI";else InDuongDi();delete*A,DanhDau,L;

getch();}

 Biên Soạn: Đào Anh Pha Trang 50

Page 52: Giao Trinh Th Ltdt

8/4/2019 Giao Trinh Th Ltdt

http://slidepdf.com/reader/full/giao-trinh-th-ltdt 52/52

Giáo Trình Thự c Hành Lý Thuyế t  Đồ Th ị  

THUẬT TOÁN

[] Kiểm tra tính liên thông của đồ thị ..............................................................................[] Đếm số thành phần liên thông của đồ thị ....................................................................

[] Thuật toán tìm mọi đườ ng đi từ đỉnh D đến đỉnh C ....................................................[] Thuật toán tìm một đườ ng đi Euler..............................................................................[] Thuật toán tìm một đườ ng đi Hamilton .......................................................................[] Thuật toán Dijkstra tìm đườ ng đi ngắn nhất ................................................................[] Thuật toán Prim tìm cây phủ tối tiểu ...........................................................................[] Thuật toán Kruskal tìm cây phủ tối tiểu ......................................................................[] Thuật toán đệ quy tìm mọi đườ ng đi Euler..................................................................[] Thuật toán đệ quy tìm mọi đườ ng đi Hamilton ...........................................................

[] Thuật toán toán khử đệ quy tìm mọi đườ ng đi Euler...................................................[] Thuật toán toán khử đệ quy tìm mọi đườ ng đi Hamilton ............................................