CHƢƠNG CÂY VÀ CÂY KHUNG CỦA ĐỒ THỊ Cây tính chất - Cây đồ thị vơ hướng, liên thơng, khơng có chu trình - Rừng đồ thị vơ hướng, khơng có chu trình Như vậy, rừng đồ thị mà thành phần liên thơng Ví dụ: 1.1 c om Hình Rừng gồm T1, T2, T3 Định lý 1: ng th Chứng minh: Ta chứng minh định lý theo sơ đồ sau: (1) (2) (3) (4) (5) (6) (1) an co ng Giả sử G=(V,E) đồ thị vô hướng n đỉnh Khi mệnh đề sau tương đương: (1) T cây; (2) T không chứa chu trình có n-1 cạnh; (3) T liên thơng có n-1 cạnh; (4) T liên thơng cạnh cầu; (5) Hai đỉnh T nối với đường đơn; (6) T khơng chứa chu trình thêm vào cạnh ta thu chu trình cu u du o (1) (2): T nên T khơng chứa chu trình Ta chứng minh “cây có n đỉnh có n-1 cạnh” Rõ ràng khẳng định với n=1 Giả sử n>1 Trước hết nhận xét T có n đỉnh tìm đỉnh đỉnh treo (đỉnh có bậc 1) Thực vậy, gọi v1, v2 , ,vk đường dài (theo số cạnh) T Khi rõ ràng v1 vk đỉnh treo, từ v1 (hoặc vk) khơng có cạnh nối với đỉnh số đỉnh v2, v3 , ,vk (do đồ thị khơng chứa chu trình), với đỉnh khác đồ thị (do đường xét dài nhất) Loại bỏ v cạnh (v1,v2) khỏi T ta thu T1 với n-1 đỉnh, mà theo giả thiết qui nạp có n-2 cạnh Vậy T có n-2+1 = n-1 cạnh (2) (3) Giả sử T khơng liên thơng Khi T có k (k≥2) phần liên thông T1, T2, ., Tk Do T khơng chứa chu trình nên Ti (i=1,2, .,k) khơng chứa chu trình, Ti Do gọi n(Ti) e(Ti) số đỉnh cạnh Ti Ta có: e(Ti) = n(Ti) – 1, i= 1, 2, , k, suy n-1 = e(T) = e(T1) + + e(Tk) = n(T1) + +n(Tk) – k = n(T) –k < n-1 (do k≥2) Mâu thuẫn chứng tỏ T liên thông (3) (4) Việc loại bỏ cạnh khỏi T dẫn đến đồ thị với n đỉnh n-2 cạnh rõ ràng đồ thị không liên thông Vậy cạnh T cầu CuuDuongThanCong.com https://fb.com/tailieudientucntt (4) (5) Do T liên thơng nên hai đỉnh nối với đường đơn Nếu có cặp đỉnh T có hai đường đơn khác nối chúng, từ suy đồ thị chứa chu trình, cạnh chu trình khơng phải cầu (mâu thuẫn giả thiết) (5) (6) T khơng chứa chu trình, có chu trình suy tìm cặp đỉnh T nối với hai đường đơn Bây giờ, thêm vào T cạnh e nối hai đỉnh u v T Khi cạnh với đường đơn nối u với v tạo thành chu trình T Chu trình thu nhất, thu nhiều chu trình suy T trước phải có sẵn chu trình (6) (1) Giả sử T khơng liên thơng Khi gồm thành phần liên thơng Vì vậy, thêm vào T cạnh nối hai đỉnh thuộc hai thành phần liên thông khác ta khơng thu thêm chu trình Điều mâu thuẫn với giả thiết (6) .c om Định lý chứng minh 2.1 ng th an co ng Cây khung đồ thị G=(V,E) đồ thị vô hướng liên thông Cây khung đồ thị G T=(V,F) với F Như Cây khung - Cây (liên thơng, khơng chu trình) - Có số đỉnh với đồ thị số cạnh Hình Đồ thị khung Định lý (Cayley): (chấp nhận) du o Số khung đồ thị đầy đủ Kn nn-2 cu u Ví dụ: n=3=> có khung, n=4 có 16 khung Nhận xét: số lượng khung đồ thị lớn 2.2 Các thuật tốn tìm khung 2.2.1 Sử dụng thuật tốn duyệt theo chiều sâu void DFS1(v) { tham[v]=1; //ghi nhận thăm v để sau không thăm For (u Ke(v)) // xét tất đỉnh u kề với v If (!tham[u]) { T=T (v,u); //them canh (v,u) vao tap T DFS1(u); //neu u chua thăm, thăm u CuuDuongThanCong.com https://fb.com/tailieudientucntt E } } ng c om 2.2.2 Sử dụng thuật toán duyệt theo chiều rộng void BFS1(v) { queue= ; //khởi tạo hàng đợi rỗng push(queue,v); //cất v vào queue tham[v]=1; //ghi nhận thăm v để sau không thăm while (queue ) // xét tất đỉnh u kề với v { v=pop(queue); //lay v tu queue for (u Ke(v)) // xét tất đỉnh u kề với v If (!tham[u]) { push(queue,u); tham[u]=1; T=T (v,u); //them canh (v,u) vao tap T } } } c(H) = an co Tìm khung nhỏ Cho G=(V,E) đồ thị vơ hướng liên thơng, cạnh e có trọng số c(e)>=0 Giả sử H=(V,T) khung đồ thị G Ta gọi độ dài c(H) khung H tổng trọng số cạnh nó: c (e) T th e ng Bài toán đặt tìm khung với độ dài nhỏ 10 18 du o Ví dụ: Cây khung nhỏ cạnh tô đậm u 12 16 30 cu 14 26 Ví dụ: * Bài toán xây dựng hệ thống đường sắt: Xây dựng hệ thống đường sắt nối n thành phố cho hai thành phố ln có đường chi phí xây dựng nhỏ Bài tốn đặt tốn tìm khung nhỏ đồ thị đầy đủ n đỉnh, đỉnh tương ứng với thành phố, với độ dài các cạnh chi phí xây dựng đường ray nối hai thành phố tương ứng * Bài tốn nối mạng máy tính: Trong quan có n phịng ban, phịng có máy tính Cần nối n máy tính thành mạng LAN cho chi phí Biết chi phí nối máy i với máy j c[i,j] CuuDuongThanCong.com https://fb.com/tailieudientucntt * Nhận xét: Nếu xét tất khung chọn khung nhỏ trường hợp đồ thị đầy đủ, đòi hỏi thời gian cỡ nn-2 , khơng thể thực số đỉnh nhiều Rất may toán khung nhỏ có thuật toán hiệu để giải chúng .c om 3.1 Thuật toán Kruskal *Ý tƣởng Sắp xếp danh sách cạnh theo trọng số tăng dần (Để xếp nhanh nên sử dụng thuật toán Heap Sort Quick Sort) Lần lượt chọn n-1 cạnh danh sách cạnh từ trái sang phải cho cạnh chọn không tạo thành chu trình với cạnh chọn trước Thuật tốn kiểm tra chu trình Ban đầu xem có n con, có đỉnh gốc Mỗi có đỉnh gọi gốc, đỉnh gốc có trước -1 Xét cạnh (i,j), giả sử i thuộc gốc u, j thuộc gốc v Nếu u khác v cạnh (i,j) chọn ta gán truoc[u]=v để ghép gốc u gốc v thành có gốc v co ng *Cài đặt int dsc[max][3];//danh sach canh int n, m;//so dinh va so canh int truoc[max]={-1}; cu u du o ng th an int Goc(int i){ while (truoc[i] ! = -1) i=truoc[i]; return i; } void Kruskal(){ SapXepDSC(); int sc=0, cd=0; int ck[max][3]; for (int k=0; k