Kỹ thuật Find union

59 717 0
Kỹ thuật Find union

Đ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

1 Kỹ thuật FindUnion 2 1.1 Công viên 2 1.2 Thành phần liên thông 8 1.3 Tính liên thông 13 1.4 Chu trình 14 1.5 Cây khung 17 1.6 Cây khung cực tiểu 20 1.7 Rừng khung 24 1.8 Rừng khung cực tiểu 30 1.9 Mạng 35 1.10 Van nước 39 1.11 Cầu 42 1.12 Giao khung 47 1.13 Đỉnh khớp 47 1.14 Liên thông hóa 52 1. 15 Chia đội 55 1.16 Kiến 59

MỤC LỤC Kỹ thuật Find-Union 1.1 Công viên .2 1.2 Thành phần liên thông 1.3 Tính liên thông 13 1.4 Chu trình 13 1.5 Cây khung 16 1.6 Cây khung cực tiểu 20 1.7 Rừng khung 24 1.8 Rừng khung cực tiểu 30 1.9 Mạng 35 1.10 Van nước 39 1.11 Cầu 42 1.12 Giao khung .47 1.13 Đỉnh khớp 47 1.14 Liên thông hóa 51 15 Chia đội 55 1.16 Kiến 59 1 Kỹ thuật Find-Union Kỹ thuật Find-Union (Tìm-Gộp) dùng để quản lí hợp tập rời Ta minh hoạ kỹ thuật qua toán sau: 1.1 Công viên Cô giáo dẫn em thiếu nhi chơi công viên Lớp có n em mã số từ đến n Vào công viên, để bạn khỏi lạc nhau, cô giáo qui định chia nhóm sau: Cô đọc mã số cặp hai bạn Hai bạn thuộc nhóm Dĩ nhiên, bạn A B nhóm, bạn B C nhóm ba bạn A, B C nhóm Cô qui định bạn có số hiệu nhỏ nhóm làm nhóm trưởng Sau m lần ghép cặp em chia thành nhóm, liệt kê mã số bạn nhóm Input: text file Park.inp • Dòng đầu tiên: hai số nguyên dương n m, • Dòng thứ i số m dòng tiếp theo: dòng hai số nguyên dương a b mã số hai bạn ghép vào nhóm Output: Hiển thị • Dòng đầu tiên: k − số lượng nhóm • Tiếp đến k dòng, dòng liệt kê danh sách nhóm Thí dụ Park.inp 5 Output Ý nghĩa: Tổng cộng em chia thành nhóm Nhóm thứ gồm bạn có số hiệu 1, 5; Nhóm thứ hai bạn: 3, Nhóm cuối có bạn: Thuật toán Điều lí thú kỹ thuật điểm nhóm trưởng em mang số hiệu nhỏ nhóm Lúc đầu, chưa ghép cặp em tạo thành nhóm riêng Như vậy, lúc đầu ta có n nhóm Vì nhóm có em nên em nhóm trưởng Ta mường tượng bạn j phải bám thắt lưng bạn đứng trước i nhóm Theo qui định cô giáo j > i Riêng nhóm trưởng, có số hiệu nhỏ nên i tự bám thắt lưng Ta sử dụng mảng nguyên chiều d[1 n] để quản lí nhóm Ta gán d[j] = i bạn j phải bám vào bạn i bạn có số hiệu nhỏ mình: i  j I < j Lúc đầu ta khởi trị d[i] = i; i = n: i  i, với ý nghĩa: lúc đầu bạn tạo thành nhóm người tự làm nhóm trưởng, bạn tự bám thắt lưng Mảng d gọi mảng tham chiếu Như ta thấy sau này, nhờ d ta nhanh chóng tìm nhóm trưởng em Ta qui ước gọi d mảng chứa thông tin liên kết phần tử tập d [1] [2] [3] [4] [5] [6] [7] [8] Mỗi cô giáo yêu cầu ghép cặp (i, j) ta hiểu là: nhóm có em i cần hợp (gộp) với nhóm có em j Để ghép cặp (i, j) ta thực bước sau đây: Bước Tìm nhóm trưởng x nhóm có em i; Bước Tìm nhóm trưởng y nhóm có em j; Bước Quyết định xem nhóm trưởng nhóm gộp Dễ hiểu nhóm trưởng em có số hiệu nhỏ nhóm trưởng x y, tức Min(x,y) Sau ta gộp nhóm theo kỹ thuật tham chiếu: Giả sử x < y Ta việc gán d[y] = x, yx Ý nghĩa việc là: cô giáo qui định nhóm trưởng y phải bám thắt lưng nhóm trưởng x Ta suy em nhóm y theo nhóm trưởng y, mà y lại theo x nên em nhóm y theo x Nếu x > y ta gán d[x] = y, xy với ý nghĩa tương tự Nếu x = y có nghĩa i j nhóm (vì có nhóm trưởng) nên ta làm Bạn quan sát hình để phát qui luật cập nhật cặp học sinh theo yêu cầu cô giáo d [1] [2] [3] [4] [5] [6] [7] [8] 3 d [1] [2] [3] [4] [5] [6] [7] [8] d [1] [2] [3] [4] [5] [6] [7] [8] 6 d [1] [2] [3] [4] [5] [6] [7] [8] 1 6 Để cập nhật cặp (5,1) ta để ý nhóm trưởng 2, d[5] = 2, nhóm trưởng 1, d[1] = Vì < nên ta cho nhóm trưởng bám vào nhóm trưởng 1, tức gán d[2] = 1, 21 d [1] [2] [3] [4] [5] [6] [7] [8] 1 3 6 Hàm Init khởi trị mảng d[1 n], d[i] = i với ý nghĩa lúc đầu em tạo thành nhóm riêng biệt với nhóm trưởng void Initd() { for (int i = 1; i n >> m; // doc so nguoi n, so cap ghep m Initd(); soNhom = n; // luc dau co n nhom for (i = 1; i > x >> y; // doc cap ghep x y soNhom -= Union(x,y); // gop nhom co x voi nhom chua y // giam so nhom neu hai nhom khac } f.close(); // dong input file // Giai trinh ket qua cout [...]... integer; procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; 11 end; function SoThanhPhanLienThong: integer; var i,k,x,y: integer; f:... integer; procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; end; function ChuTrinh: integer; var i,x,y,GapChuTrinh: integer; f: text;... canh; procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; end; procedure CayKhung; var i, j, u, v, n1: integer; f: text; begin assign(f,inf);... } procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; end; { Sap cac canh tang theo trong so p } procedure Sort(dau, cuoi: integer);... canh; procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; end; function CanhKhung: integer; var i, j, u, v, n1: integer; f: text; begin... integer; procedure Initd; var i: integer; begin for i := 1 to n do d[i] := i; end; function Find( x: integer): integer; begin while (x d[x]) do x := d[x]; Find := x; end; function Union( x, y: integer): integer; begin Union := 0; x := Find( x); y := Find( y); if (x = y) then exit; if (x < y) then d[y] := x else d[x] := y; Union := 1; end; { Sap tang cac canh cua do thi theo trong so } procedure PSort(dau,cuoi:... ++i) d[i] = i; } int Find( int x) { while (x != d[x]) x = d[x]; return x; } int Union( int x, int y) { x = Find( x); y = Find( y); if (x == y) return 0; if (x < y) d[y] = x; else d[x] = y; return 1; } int ChuTrinh(){ int i, x, y; ifstream f(inf); // mo input file f >> n >> m; // doc so dinh n, so canh m Initd(); for (i = 1; i > x >> y; // doc canh x y if (Union( x, y) == 0)... thuoc dinh 6: 6 8 Ghi nhớ Sau khi vận dụng kỹ thuật Find- Union mảng thông tin liên kết d cho ta các thông tin sau đây: Với mỗi đỉnh i = 1 n • d[i] = 1 khi và chỉ khi đỉnh i là "nhóm trưởng", tức là đỉnh đại diện cho một thành phần liên thông trong đồ thị; 12 • Số lượng thành phần liên thông trong G = số lượng nhóm trưởng = số lượng các đỉnh i thỏa điều kiện Find( i) = i; • Hai đinht i và j thuộc cùng... int n; // so dinh int m; // so canh int d[MN]; struct canh { int x, y, manh; } khung[MN]; void Initd() { for (int i = 1; i

Ngày đăng: 06/09/2016, 17:36

Từ khóa liên quan

Mục lục

  • 1 Kỹ thuật Find-Union

    • 1.1 Công viên

      • Thí dụ

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

      • 1.2 Thành phần liên thông

        • Thí dụ

        • Thuật toán

        • Chương trình C++

        • Chương trình Pascal

        • Kết quả

        • Ghi nhớ

        • 1.3 Tính liên thông

          • Thí dụ

          • Thuật toán

          • Chương trình C++

          • Chương trình Pascal

          • 1.4 Chu trình

            • Thí dụ 1

            • Thí dụ 2

            • Thuật toán

            • Chương trình C++

            • Chương trình Pascal

            • 1.5 Cây khung

              • Thuật toán Kruskal:

Tài liệu cùng người dùng

Tài liệu liên quan