Bằng hình vẽ ta có thể biêu điễn mỗi đỉnh của đồ thị bởi một điểm trên mặt phẳng, mỗi cạnh bởi một đường nối hai điểm tương ứng hai đỉnh.. Bậc của đỉnh Với mỗi đỉnh v của đồ thị, ta định
Trang 1BAO CAO HOC THUAT
Đề tài: Thuật toán gán nhãn đề thị và lập trình tìm đường đi
ngăn nhất băng thuật toán Disjstra
Người thực hiện: Nguyễn Tuấn Anh
Bộ môn: Mạng máy tính — Khoa Công nghệ thông tin
Hà nội- 6/2022
Trang 2
MỤC LỤC
1.1 ĐỊNH NGHĨA ĐÔ THỊ VÀ CÁC KHÁI NIỆM - 5-52 S222 2ESErrcrerrrrrrerree 4
1.1.3 Đỉnh kề .Ă 2.22Q2.2.H.S.HH HH Heo 5
1.1.4 Cạnh liên thUỘC .- C01 Q 1Q n nọ nh ng ng cv vs 5 1.1.5 Bậc của đỉnh cọ HH HH TH ng gu KH kg 5
1.2 ĐƯỜNG ĐI VÀ CHU TRÌNH 2 2S 2212122 221212181111 2121 1011211111111 erreg 6
Non 6 I2 ti ThhkdđadđaiaŨ 6
1.2.4 Đơn đồ thị, đa đồ thị và đồ thị COF - 222221212 SH 1x re go 6
2.1.BIEU DIEN DO THI BANG MA TRAN KE ccccccccsssescssecesesescesescscsesreseseateceseseseeneess 9 2.2 BIÊU DIỄN ĐỒ THỊ BẰNG DANH SÁCH CẠNH -0- 2c 0S crrrerererree 12 2.3 BIÊU DIỄN ĐÔ THỊ BẰNG DANH SÁCH LÂN GẬN KÈ 2-7 75255: 16
3.1.KHÁI NIỆM VỀ ĐƯỜNG ĐI VÀ ĐƯỜNG ĐI NGẮN NHÁT 5 525552 19 3.2 THUAT TOAN GAN NHAN BO THI GIAI BÀI TOÁN 1 -c-c- s52 20 3.3 THUAT TOAN DIJKSTRA GIAI BAI TOAN 2 ccccssssestesestescssescsnesesnsseessseeseseensseenss 25
Trang 3LỜI NÓI ĐẦU
Trong thực tế có rất nhiều bài toán liên quan tới một tập các đối tượng và
những mối liên hệ giữa chúng, đòi hỏi toán học phải đặt ra mô hình biểu diễn một
cách chặt chẽ và tổng quát bằng ngôn ngữ ký hiệu Những ý tưởng cơ bản của đồ thị được đưa ra từ thế ky thi XVIII boi nha todn hoc Thuy Si Leonhard Euler tu
mô hình đồ thị đề giải bài toán về những cây câu Kũnigsburg nỗi tiêng
Lý thuyết đỗ thị đã được khoa học phát triển từ rất lâu và ngày càng có nhiều ứng dụng Đến ngày nay, với sự ra đời của máy tính điện tử và sự phát triển nhanh chóng của tin học, Lý thuyết đồ thị cảng được quan tâm nhiều hơn, các thuật toán trên đồ thị đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như: mạng Máy tính, Đồ hoạ máy tính, Lý thuyết mã, Tối ưu hoá, Kinh tế học
Trang 4CHƯƠNG 1- KHÁI NIỆM VÀ CÁC DẠNG ĐỒ THỊ
1.1 ĐỊNH NGHĨA ĐỒ THỊ VÀ CÁC KHÁI NIỆM
1.1.1 Định nghĩa đồ thị
Một đồ thị G bao gồm một tập hợp hữu hạn V, mà mỗi phần tử được gọi là
đỉnh (hoặc nút) và một tập hợp E gồm các cặp hai đỉnh u và v đạng e = (u, v) Ký hiệu đồ thị G là G = (V, E)
Tập V là hữu hạn, có nghĩa là ta có thê đánh số thứ tự là 1, 2, 3, hoặc a, b, c, cho các phân tử (hay các đỉnh) của V Ta quy ước khi nói đến đỗ thị G thì số đỉnh của đồ thị là n, số cạnh (hay cung) m tức là |V| = n, |E|= m
1.1.2 Đồ thị có hướng và không có hướng
Giá sử u và v là hai đỉnh của đồ thị G = (V, E), nếu cặp
(u, v) e E có kế đến thứ tự u là đỉnh đầu, v là đỉnh cuối thì ta gọi đó là đồ thị có hướng, khi đó mỗi e = (u, v) được gọi là cung (hình 1.1)
SS
Yh Hình 1.1 Đồ thị có hướng
Ngược lại ta gọi đó là đồ thị vô hướng (hay đồ thị không có hướng) và (u, v) gọi là cạnh nối đỉnh u, v và cũng ky higu 1a e = (u, v) € E (hình 1.2)
POF
Hình 1.2 Đồ thị vô hướng
Trang 5Bằng hình vẽ ta có thể biêu điễn mỗi đỉnh của đồ thị bởi một điểm trên mặt
phẳng, mỗi cạnh bởi một đường nối hai điểm tương ứng hai đỉnh Với đồ thị có
hướng ta thêm vào cạnh một mũi tên hướng tử đỉnh đầu tới đỉnh cuối
NếuueV,veVvàe= (u, v) e E ta nói rằng u, v là 2 đỉnh kề nhau và cạnh
e liên thuộc với đỉnh u và đỉnh v Ví dụ cạnh (1, 5) trong hình 1.2 là cạnh liên thuộc với đỉnh I và đỉnh 5
1.1.5 Bậc của đỉnh
Với mỗi đỉnh v của đồ thị, ta định nghĩa bậc (degree) của đỉnh v ký hiệu
deg(v) là số cạnh liên thuộc với v hoặc là số đỉnh kề của v Trên đồ thị hình 1.2 thi
Hệ quả: Trong đồ thị vô hướng, số đỉnh bậc lẻ là một số chăn
Đối với mỗi đồ thị có hướng G = (V, E), xét một cung ee E, nếu e= (u, v) thì
fa nói u nỗi tới v và v nôi từ u, cung e là ổi ra khỏi u và đi vào v Đỉnh u khi đó là đỉnh đâu, đỉnh v được gọi là đỉnh cuỗi của cung e
Bán bậc ra và bán bậc vào
— Bán bậc ra là số cung đi ra từ đỉnh v, ký hiệu deg*(v)
— Bán bậc vào là số cung đi vào đỉnh v: ký hiệu đeg(v)
— Trong hình 1.1 thì bán bậc vảo đỉnh 4 là 1 và bán bậc ra là 2
deg*(4) = 2;
deg (4) = 1
Trang 6Dinh ly: >, deg'(v) =>) deg (v)
v được gọi là đỉnh cuối
Trong trường hợp u = v, người ta nói rằng ơ(u, v) là đường đi khép kín Nếu đường đi œ(u, v), mỗi cạnh (cung) có mặt không quá một lần thì được gọi là đường
Đồ thị G mà mỗi cạnh của nó đều được gắn với một số không âm, thể hiện thông tin liên quan tới cạnh đó, gọi là đồ thị có trọng số Nói cách khác đồ thị có trọng số nêu có ánh xạ f: E—> Rẻ; trong đó E là tập cạnh, R* là tập số thực không
am w= f(u, v) goi la trong số của cạnh (u, v) eE
Đề thị mà mỗi cạnh không được gắn trọng số thì ta gọi đó là đồ thị không có
trọng SỐ
Trọng số của đồ thị được mở rộng tự nhiên cho dé thi có hướng
1.2.4 Đơn đồ thị, đa đồ thị và đồ thị con
e Đơn đồ thị
Trang 7Đơn đồ thị là đồ thị vô hướng G = (V, E) bao gồm V là tập các đỉnh, và E là
tập các cạnh thỏa mãn không có hai cạnh có chung cả hai đỉnh (không có cạnh lặp)
(Sy Hình 1.4.Đơn đồ thị
© Da do thi
G =(V, E) bao gồm V là tập các đỉnh, và E là tập các cạnh trong đó một cặp
(không có thứ tự) hai phần tử khác nhau của V có thể xác định nhiều cạnh Hai
cạnh e¡ và e2 được gọi là cạnh lặp nếu chúng củng tương ứng với một cặp đỉnh; ví
du (3, 5) va (5, 3), hình 1.5
Hinh 1.5 Da dé thi
Chú ý: Khi G là đa đồ thị, dãy các đỉnh trong định nghĩa đường đi có thể xác định nhiều đường đi khác nhau Trong trường hợp đó, đường đi xác định bằng dãy các cạnh sẽ rõ ràng hơn
4)} là đồ thị con của đô thi
G bởi vìWCcV,FcE
Hình 1.6 Đồ thị con của một đỏ thị
Trang 8Cho G = (V, E) ; tập Vị C V Đồ thị con có tập đỉnh Vị và tập cạnh chứa tat ca các cạnh của G nối hai đỉnh thuộc Vị gọi là đồ thị con sinh bởi VỊ
Chú ý: Thuật ngữ đồ thị trong mỗi ngữ cảnh để ngắn gọn và cũng không gây nhằm lẫn có thể được hiểu là đơn đồ thị, đồ thị vô hướng hay đồ thị có hướng
Trang 9CHƯƠNG 2-BIẾU DIEN ĐỒ THI TREN MAY TÍNH
Người ta có thê biểu diễn đồ thị trên mặt phẳng dưới dạng các điểm ứng với các đỉnh và các đường nỗi chúng với nhau ứng với các cạnh Để sử dụng máy tính
giải các bài toán được mô tả bởi mô hình đồ thị người ta phải tìm cách khác để mô
tả đồ thị Việc lựa chọn các cấu trúc đữ liệu khác nhau để mô tả đồ thị trên máy tính phụ thuộc vào bài toán cần giải và thuật toán được lựa chọn Trong chương
này chúng ta xem xét đồ thị G = (V, E) với |V| = n, |E| = m (n: số đỉnh, m: số cạnh)
2.1.BIEU DIEN DO THI BANG MA TRAN KE
Cho dé thi G = (V, E) c6 tap dinh V = {v1, v2, Va} và tập các cạnh E, ma
trận kề của đồ thị là ma trận vuông À kích thước nxn (có n hàng và n cột), gồm các
Ma trận kê có một số tính chat sau:
— Ma trận kề của dé thị vô hướng là đối xứng
— Ma trận kề của đồ thị có hướng nói chung không có tính đối xứng
— a¡ = Ö với mọi 1= Ì, 2, , n
— Tông các giá trị trên hàng ¡ (hay cột j) bằng bậc của đỉnh v¡ (hay vị) của đồ thị
vô hướng.
Trang 10Có thể hiểu đồ thị G = (V, E) như là đồ thị có trọng số và trọng số f(u, v) =l nếu (u, v) e E và {u, v)=0 trong trường hợp ngược lại, khi đó với đỗ thị có trọng
số ta có thé lập ma trận trọng số tương tự ma trận kề với aj = Í(v¡, Vị) — trọng số cung (vị, vị) nếu cung (vị, vị) e E và aj= ^ trong trường hợp ngược lại ở đây ^ là giá trị được chọn tuy theo từng trường hợp cụ thể Với hình 1.4 thì ta có ma trận trong số biểu diễn sơ đồ đường sắt Bắc Nam như sau:
5000 bởi vì thực tế chiều đài lãnh thổ của nước ta cũng chỉ khoảng hơn 2000 km
từ Bắc vào Nam và gán a¡ = 0 cho biết không có cung (vị, v¡), hay khoảng cách vị dén v; 1a 0
Với bài toán này ta cũng sẽ lưu số liệu vào tệp tin là dothi14.inp
hướng, ví dụ đỗ thị hình 2.3 sẽ được lưu số liệu vào tệp tin dothi23.inp
Hình 2.3 Đồ thị có hướng không trọng số
Trang 11đồ thị có hướng, ví dụ đồ thị hình 2.3 sẽ được lưu số liệu vào tệp tin dothi25.inp
Trang 122.2 BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH CẠNH
Trong trường hợp G = (V, E) là đồ thị thưa ta có thể biêu diễn đồ thị bởi danh
sách cạnh Các cạnh của đồ thị được sắp xếp theo một thử tự nào đó dạng (u, v) trong đó u là đỉnh đâu, v là đỉnh cuối
Hình 2.8 Đồ thị vô hướng không có trọng số
Ví dụ, danh sách cạnh của đồ thị vô hướng không có trọng số cho trong hình
2.9, được biểu diễn như bảng sau:
Danh sách cạnh biểu diễn của đồ thị trên hình 2.9
int dau,cuoi; // đau: đỉnh đầu của cạnh
/ cuoi: đỉnh cuối của cạnh
Trang 13Với đồ thị hình 2.9, ta cũng sử dụng Notepad để soạn thảo tệp đữ liệu đưới
(n = 4) và thành phần thứ hai là số 5 cho biết đồ thị có 5 cạnh
(m = 5) Các dòng còn lại, tại mỗi dòng cho biết thành phản thứ nhất là số hiệu
đỉnh đầu, và thành phần thứ hai là số hiệu đỉnh cuối của mỗi cạnh tương ứng trong
Trang 14Đôi với đồ thị có hướng không có trọng so ta van su dung câu trúc dữ liệu như
đồ thị vô hướng không có trọng số, đô thị có hướng và có trọng sô ta sử dụng câu trúc dữ liệu như đồ thị vô hướng có trọng sô
Hình 2.12 Đồ thị có hướng không có trọng số
Xét đồ thị có hướng không trọng số như đồ thị hình 2.13, chúng ta cũng biểu
diễn dưới dạng danh sách cạnh của nó là:
Trang 15Chúng ta sẽ xây dựng chương trình để đọc và hiển thị danh sách cạnh của đồ
thị được lưu trong tệp tin dothi213.inp như sau:
Trang 16printf("\nDo thi G co %d dinh va %d canh\n",n,m);
printf(\nSTT Dau Cuoi\n");
for(i = 1; i<= m; i++)
printf("%3d %3d %3d\n", (i+1), Efi].dau, Efi].cuoi);
Hình 2.14 Chạy chương trình vidu22.cpp
2.3 BIEU DIEN DO THI BANG DANH SACH LAN CAN KE
Cho dé thi G=(V, E), v6 hướng và không có trọng số như sau:
Cy)
We
©)
Hình 2.15 Đồ thị vô hướng không có trọng số
Trong cách biểu diễn này mỗi đỉnh v tương ứng với một danh sách N(v) các
đỉnh kể với nó, tức là
N(v) = {w e V: (v, w) e E}, Ký hiệu N(x) thường được sử dụng
để nói lên lực lượng của đại lượng x
Trang 17Trong ví dụ thuộc hình 2.16 danh sách kể được mô tả như trong bảng dưới đây
Danh sách lần cận của các đỉnh trong đồ thị hình 2.16 là:
kể của mỗi đỉnh trong đô thị để đánh dấu hết đỉnh kề của đỉnh tương ứng, ví dụ
đỉnh 1 có các đỉnh kề là 2, 3, 6 thì ta thêm số 0 vào cuối để mỗi khi chương trình
đọc sẽ kiểm tra xem đã hết các đỉnh kề của đỉnh l chưa, thực chất của việc làm này là đo ta sử dụng tệp tin văn bản đề lưu trữ, mà cách đọc của ngôn ngữ lập trình
€ đối với tệp tin văn bản là đọc tuần tự đến hết tệp thì thôi chứ không đọc từng khối như cách đọc tệp tin nhị phân
17
Trang 18Trong bảng này cho ta biết đỉnh 1 có các đỉnh kề là 2, 3 và 6; đỉnh 2 có các đỉnh kề là 1, 3 và 4 Với cách biêu diễn này ta khai báo cầu trúc đữ liệu cho mỗi
đỉnh là một nút của danh sách liên kết đơn Khai báo một mảng con trỏ các nút đề lưu các danh sách mà mỗi phần tử của mảng sẽ trỏ đến nút đầu tiên của các danh
sách liên kết này; đanh sách thứ ¡ lưu những đỉnh kể của đỉnh ¡
typedef struct Dinh
{
int tendinh;
Dinh *next;
Dinh *DC[MAX]; // MAX = 100 là hằng số cho trước
Cấu trúc dữ liệu kiểu này được gọi là danh sách tổng quát Chúng ta thấy rằng trong ngôn ngữ lập trình C thì chỉ số của phần tử đầu tiên của mảng là 0, nhưng chúng ta cũng có thể bắt đầu từ chỉ số là 1, trong trường hợp lấy chỉ số của mảng
bắt đầu là 1 thì chúng ta phải khai báo mảng có kích thước phù hợp với yêu cầu
của bài toán
Đối với đồ thị vô hướng có trọng số, đồ thị có hướng không trọng số và đồ thị
có hướng có trọng số thì chúng ta cũng có thê xây dựng cấu trúc đữ liệu kiểu danh sách lân cận đề lưu trữ và xử lý
Sau đây chúng ta sẽ xây dựng chương trình nhập đữ liệu cho đồ thị từ tệp tin
và hiển thị danh sách lân cận, lưu đồ thị trong hình 2.16 và hình ảnh lưu trữ của nó
được minh hoạ trong hình 2.17, mảng DC sẽ lấy chỉ số 1 là phần tử đầu tiên của mảng (cách lấy này để cho việc cài đặt và xử lý cho tự nhiên theo số hiệu các đỉnh
bởi vì ta lay số hiệu đỉnh bắt đầu là 1) Vì đồ thị có n đỉnh, cho nên chúng ta sẽ có
n danh sách liên kết đơn, danh sách thứ ¡ lưu các đỉnh kề của đỉnh thứ ¡ trong đồ
thị, vì vậy chúng ta sẽ phải viết các hàm thao tác trên danh sách liên kết đơn như
hàm void themvaodanhsachúnt x, Dinh **L): có tác dụng thêm một nút có nội
dung là x vào cuối danh sách liên kết đơn được quản lý bởi con trỏ L, ham hién thi danh sách void hienthidanhsach(Dinh *L): dùng để hiển thị danh sách được quản
Trang 19CHƯƠNG 3- ĐƯỜNG ĐI NGẮN NHẤT
3.1.KHÁI NIỆM VỀ ĐƯỜNG ĐI VÀ ĐƯỜNG ĐI NGẮN NHẤT
Trong thực tế cuộc sống, do thói quen người ta thường vẽ lên giấy những điểm biểu thị cho các cá thể, các khu dân cư, các đơn vị hành chính, các nút giao thông và nối các điểm đó với nhau bằng những nét vẽ hoặc những mũi tên đặc trưng cho mối liên hệ nào đó Các sơ đồ này đùng ở khắp mọi nơi với các tên gọi khác nhau Trong kinh tế gọi đó là sơ đồ tô chức Trong giao thông vận tải gọi đó
là mạng giao thông Chính D.Konig là người đầu tiên đề nghị gọi các sơ đồ đó là
“đồ thị", đồng thời đề n ghị nghiên cứu một cách có hệ thống các tính chất của nó Rất nhiều ngành khoa học khác nhau sử dụng những khái niệm định lý, hệ quả, bỗ đề của Lý thuyết đồ thị đê đưa vào xây dựng các ứng dụng trong ngành của mình Điều này càng chứng tỏ “Lý thuyết đồ thị" có rất nhiều ứng dụng trong
xã hội Đề có thể áp dụng vào các lĩnh vực khác nhau, Lý thuyết đồ thị đã được hình thức hoá với nhiều khái niệm, định lý được định nghĩa một cách trừu tượng nhưng vẫn giữ được mỗi quan hệ với những đồ thị thực tế Trong chương này chúng ta cũng sẽ nghiên cứu một số thuật toán tìm đường đi ngắn nhất trên đồ thị
f: E — R+ và đỉnh ueV Đường ổi của từ đỉnh u đến đỉnh v được thê hiện bằng:
U =€I, ©2, ,em = V
hay u = (1, U2), (U2, U3), (Ui-1, Ui), ,(Un-1, Un), (Un, V) Va
M= Df E)= Df Ua)
u 1A tong trong sé cua cdc canh trén duong di V6i moi x € V, hay tim đường
di œ*(u, x) ngắn nhất nối u với x Chúng ta có hai bài toán cần giải quyết, bài toán
một là tìm xem cần đi qua số cạnh là ít nhất dé đi được từ u đến v, bài toán hai là
cần tìm đường đi ngắn nhất (không quan tâm đến số cung đi qua) để đi được từ u đến v mà chỉ quan tâm đến độ dài đường đi (độ dài đường đi được tính bằng đơn
vị đo chiều đài) Để giải hai bài toán này chúng ta sẽ nghiên cứu hai thuật toán
“thuật toán gán nhãn đồ thị” và “thuật toán Dijkstra”
19