IẾP TỤC CHƯƠNG 2 CỦA MÔN TOÁN RỜI RẠC MÌNH SẼ GỬI DẾN D CÁC BẠN SLIDE BÀI GIẢNG CHƯƠNG 3.2 MÔN TOÁN RỜI RẠC CỦA TRƯỜNG ĐẠI HỌC MỎ ĐỊA CHẤT MONG RẰNG VỚI CÁC SLIDE NÀY SẼ GIÚP CÁC BẠN DỄ DÀNG CHINH PHỤC ĐƯỢC MÔN TOÁN RỜI RẠC NÀY
Trang 1CHƯƠNG 3: LÝ THUYẾT ĐỒ THỊ
Trang 2NỘI DUNG
3.1 •Các khái niệm cơ bản của lý thuyết đồ thị
3.2 •Biểu diễn đồ thị trên máy tính
3.3 •Các thuật toán tìm kiếm trên đồ thị
3.4 •Đồ thị Euler và đồ thị Hamilton
3.5 •Cây và cây khung của đồ thị
3.6 •Bài toán đường đi ngắn nhất
3.7 •Bài toán luồng cực đại trong mạng 2
Trang 3BIỂU DIỄN ĐỒ THỊ TRÊN MÁY TÍNH
3.2.1 Ma trận kề Ma trận trọng số
3.2.2 Ma trận liên thuộc đỉnh - cạnh
3.2.3 Danh sách cạnh (cung)
3.2.4 Danh sách kề
Trang 53.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ví dụ:
Trang 6• Tổng các số trên hàng i = Bán bậc ra của đỉnh i = deg+(i)
• Tổng các số trên cột i = Bán bậc vào của đỉnh i = deg-(i) 6
Trang 73.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ma trận kề của đồ thị có hướng được định nghĩa một cách hoàn toàn
tương tự
Trang 83.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Chú ý: Trên đây chúng ta chỉ xét đơn đồ thị Ma trận kề
của đa đồ thị có thể xây dựng hoàn toàn tương tự, chỉ
khác là thay vì ghi 1 vào vị trí a[i, j] nếu (i, j) là cạnh
của đồ thị, chúng ta sẽ ghi k là số cạnh nối hai đỉnh i và j.
8
Trang 93.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ví dụ 1:
Trang 103.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ví dụ 2:
10
Trang 113.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ma trận trọng số:
Đồ thị có trọng số là đồ thị mà mỗi cạnh (i, j) có một giá
trị c(i, j) gọi là trọng số của cạnh
Để biểu diễn đồ thị ta sử dụng ma trận trọng số
C = {c[i, j], i, j=1 , 2, , n}
với c[i, j]= c(i, j) nếu (i, j) Є E
và c[i,j]= nếu (i,j) E trong đó số có thể được đặt bằng
một trong các giá trị sau: 0, +, -
Trang 123.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ví dụ:
12
Trang 133.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Ưu điểm lớn nhất của phương pháp biểu diễn đồ thị bằng
ma trận kề (hoặc ma trận trọng số) là để trả lời câu hỏi:
Hai đỉnh u, v có kề nhau trên đồ thị hay không, chúng ta chỉ
phải thực hiện một phép so sánh.
Nhược điểm lớn nhất của phương pháp này là: không
phụ thuộc vào số cạnh của đồ thị, ta luôn phải sử dụng n2
đơn vị bộ nhớ để lưu trữ ma trận kề của nó
Trang 143.2.1 MA TRẬN KỀ MA TRẬN TRỌNG SỐ
Qui ước khuôn dạng lưu trữ ma trận kề
Dòng đầu tiên ghi lại số đỉnh của đồ thị
N dòng kế tiếp ghi lại ma trận kề của đồ thị
Hai phần tử khác nhau của ma trận kề được viết cách
nhau một vài khoảng trống
14
Trang 15BÀI TẬP
Hãy biểu diễn các đồ thị sau đây bằng ma trận kề
Trang 16BÀI TẬP
Hãy vẽ đồ thị của ma trận liền kề sau
16
Trang 171, nếu đỉnh i là đỉnh đầu của cung 𝑒𝑗
−1, nếu đỉnh 𝑖 là đính cuối của cung 𝑒𝑗
0, nếu đỉnh 𝑖 không là đầu mút của cung 𝑒𝑗
Trang 1818
Trang 19BÀI TẬP
Hãy biểu diễn đồ thị sau bằng ma trận liên thuộc
Trang 2020
Hãy vẽ đồ thị của ma trận liên
thuộc sau
Trang 213.2.3 DANH SÁCH CẠNH (CUNG)
Trong trường hợp đồ thị thưa (đồ thị có số cạnh m thoả mãn
bất đẳng thức: m < 6n) người ta thường dùng cách
biểu diễn đồ thị dưới dạng danh sách cạnh.
Trong cách biểu diễn đồ thị bởi danh sách cạnh (cung) chúng
ta sẽ lưu trữ danh sách tất cả các cạnh (cung) của đồ thị.
Một cạnh (cung) e=(x,y) của đồ thị tương ứng với hai biến
Dau[e], Cuoi[e].
Để lưu trữ đồ thị ta cần sử dụng 2m đơn vị bộ nhớ.
Nhược điểm:
Trang 223.2.3 DANH SÁCH CẠNH (CUNG)
22
Trang 233.2.3 DANH SÁCH CẠNH (CUNG)
Biểu diễn đồ thị trọng số bằng danh sách cạnh: Bổ sung
thêm một cột là trọng số của mỗi cạnh
Trang 243.2.3 DANH SÁCH CẠNH (CUNG)
Khuôn dạng lưu trữ danh sách cạnh
Dòng đầu tiên ghi lại số N, M tương ứng với số đỉnh và
số cạnh của đồ thị Hai số được viết cánh nhau một vài
khoảng trống
M dòng kế tiếp, mỗi dòng ghi lại một cạnh của đồ thị Đỉnh
đầu và đỉnh cuối mỗi cạnh được viết cách nhau một vài
khoảng trống.
24
Trang 253.2.4 DANH SÁCH KỀ
Trong cách biểu diễn dưới dạng danh sách kề, với mỗi
đỉnh v của đồ thị chúng ta lưu trữ danh sách các đinh kề
với nó, mà ta sẽ ký hiệu là Ke(v), tức là:
Ke(v) = { u ϵ V : ( v , u ) ϵ E }
Khi đó vòng lặp thực hiện với mỗi một phần tử trong
danh sách này theo thứ tự các phần tử được xắp xếp
trong nó sẽ được viết như sau:
For u ϵ Ke(v) do
Trang 263.2.4 DANH SÁCH KỀ
Biểu diễn danh sách kề dựa vào mảng
Mảng được chia thành n đoạn
Đoạn thứ i trong mảng lưu trữ danh sách kề của đỉnh thứ i ϵV.
Để biết một đoạn thuộc mảng bắt đầu từ phần tử nào đến
phần tử nào ta sử dụng một mảng khác dùng để lưu trữ vị trí
các phần tử bắt đầu và kết thúc của đoạn.
26
Trang 273.2.4 DANH SÁCH KỀ
Trong rất nhiều thuật toán làm việc với đồ thị chúng ta
thường xuyên phải thực hiện các thao tác: Thêm hoặc
bớt một số cạnh
Trong trường hợp này cấu trúc dũ liệu dùng ở trên là không
thuận tiện Khi đó nên chuyển sang sử dụng danh sách kề liên
kết (Linked Adjancency List)
Trang 283.2.4 DANH SÁCH KỀ
Biểu diễn danh sách kề bằng danh sách liên kết.
Danh sách kề của đồ thị trong hình được mô tả như sau:
28
Trang 293.2.4 DANH SÁCH KỀ
Trang 333.2.4 DANH SÁCH KỀ
printf("\nDanh sach ke cua cac dinh cua do thi: ");
for(j=1; j<=n; j++) {
printf("\nDanh sach cac dinh ke cua dinh %d: ",j);
t = Ke[j];
while(t->next != NULL) {
printf("%6d",t->v);
t=t->next;
Trang 34➢ m*n Đơn vị bộ nhớ
➢ Dễ dàng việc thêm bớt các cạnh, đỉnh