Một số bài toán trong lý thuyết đồ thị

53 11 0
Một số bài toán trong lý thuyết đồ thị

Đ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

TRƢỜNG ĐẠI HỌC VINH KHOA CƠNG NGHỆ THƠNG TIN KHĨA LUẬN TỐT NGHIỆP ĐẠI HỌC Đề tài: Một số tốn lí thuyết thị Sinh viên thực hiện: LÊ THỊ DUNG Giáo viên hướng dẫn: THS TRẦN XUÂN SANG Vinh 5/2009 GIỚI THIỆU ĐỀ TÀI A Giới thiệu chung Bước sang kỷ 21, nhìn lại kỷ 20 kỷ mà người đạt nhiều thành tựu khoa học rực rỡ nhất, thành tựu bùng nổ ngành khoa học máy tính Sự phát triển kỳ diệu máy tính kỷ gắn liền với phát triển tốn học đại, tốn rời rạc Toán học rời rạc nghiên cứu cấu trúc có tính chất rời rạc khơng liên tục Tốn rời rạc bao gồm lĩnh vực như: quan hệ, lý thuyết đồ thị, logíc tốn, ngơn ngữ hình thức, lý thuyết đồ thị phận trọng tâm với nhiều khối lượng kiến thức lý thú nghiên cứu nhiều Toán rời rạc nói chung lý thuyết đồ thị nói riêng công cụ thiết yếu cho nhiều ngành khoa học kỹ thuật, thành phần quan trọng học vấn sinh viên ngành kỹ thuật đặc biệt sinh viên ngành Tin học Lý thuyết đồ thị, với cách tiếp cận đối tượng nghiên cứu phương pháp tư độc đáo thực ngày hữu ích có nhiều ứng dụng phong phú gây khơng bất ngờ Máy tính mà thân với q trình làm việc mang tính rời rạc, nên điều tương hợp gắn chặt lý thuyết đồ thị với cơng nghệ máy tính việc nghiên cứu đối tượng có tính chất rời rạc Trên thực tế nhiều toán liên quan đến tập đối tượng mối liên hệ chúng, đòi hỏi tốn học phải đặt mơ hình biểu diễn cách chặt chẽ tổng quát ngôn ngữ kí hiệu đồ thị Những ý tưởng đưa từ kỉ thứ XVIII nhà tốn học thuỵ sỹ Leonhard Euler, ơng dùng mơ hình đồ thị để giải tốn cầu Konigsbirg tiếng Mặc dù lí thuyết đồ thị khoa học phát triển từ lâu lại có nhiều ứng dụng đại Đặc biệt khoảng vài mươi năm trở lại đây, với đời máy tính điện tử phát triển nhanh chóng tin học, lí thuyết đồ thị quan tâm đến nhiều Đặc biệt thuật toán đồ thị có nhiều ứng dụng nhiều lĩnh vực khác như: Mạng máy tính, Lí thuyết mã, Tối ưu hố… B Mục đích đề tài Trong phạm vi luận văn nghiên cứu số tốn lí thuyết đồ thị: Bài tốn tìm chu trình Euler với thuật tốn Fleury phương pháp sử dụng ngăn xếp, Bài tốn tìm đường ngắn với Thuật toán Dijkstra, Ford_Bellman, Ployd C Cấu trúc đề tài Chương I: Một số vấn đề đồ thị Chương II: Bài tốn tìm đường ngắn  Thuật toán Dijkstra  Thuật toán Ford_Bellman  Thuật tốn Ployd Chương III: Bài tốn tìm chu trình Euler  Thuật tốn Fleury  Phương pháp sử dụng ngăn xếp CHƢƠNG MỘT SỐ VẤN ĐỀ CƠ BẢN CỦA ĐỒ THỊ 1.1 Các định nghĩa đồ thị 1.1.1 Định nghĩa đồ thị Đồ thị cấu trúc rời rạc bao gồm đỉnh cạnh nối đỉnh này, loại đồ thị khác phân biệt kiểu số lượng cạnh nối hai đỉnh đồ thị Giả sử V tập hữu hạn, không rỗng phần tử E  V  V Bộ G = gọi đồ thị hữu hạn Mỗi phần tử v  V gọi đỉnh phần tử e = (u,v)  E gọi cạnh đồ thị G = Xét cạnh e  E tồn đỉnh u,v  V cho e = (u, v), ta nói u nối với v u v thuộc e e u v - Nếu cạnh e = (u, v) mà u v hai đỉnh phân biệt ta nói u, v hai đỉnh kề - Nếu e = (v, v) e cạnh có hai đỉnh trùng ta gọi khuyên - Nếu e = (u, v) mà u,v cặp đỉnh có phân biệt thứ tự hay có hướng từ u đến v e cung, u gốc cịn v u đỉnh ra, v đỉnh vào - Khi cặp đỉnh (u,v) có nhiều cạnh ta nói cạnh cặp đỉnh cạnh song song cạnh bội uu v v u a) b) a Tại đỉnh u có khuyên v c) b Một cung có hướng từ u sang v c Cặp đỉnh (u,v) có cạnh song song Hình 1.1 Trong thực tế ta gặp nhiều vấn đề mà dùng mơ hình đồ thị để biểu diễn, sơ đồ mạng máy tính, sơ đồ mạng lưới giao thơng, sơ đồ thi cơng cơng trình Ví dụ: Xét mạng máy tính, biểu diễn mạng mơ hình đồ thị, máy đỉnh, máy nối với dây truyền, chúng tương ứng cạnh đồ thị Một mơ hình mạng máy tính Hình 1.2 có máy tính A, B, C, D tương ứng đỉnh, máy nối trực tiếp với tương ứng với cặp đỉnh kề A B C D Hình 1.2 Ví dụ đồ thị 1.1.2 Đồ thị đơn Đồ thị G = gọi đồ thị đơn hai đỉnh nối với không cạnh (cung), tức đồ thị cạnh bội, khơng có khun (Hình 1.2 ví dụ đồ thị đơn) 2.1.3 Đa đồ thị Đồ thị G = gọi đa đồ thị có cặp đỉnh nối với hai cạnh (hai cung) trở lên 2.1.4 Giả đồ thị Là đồ thị có khuyên, chứa cạnh bội, cạnh đơn Tóm lại loại đồ thị tổng quát B A C D B A C D a) b) Hình 1.3 a Đa đồ thị b Giả đồ thị 1.2 Các loại đồ thị 1.2.1 Đồ thị vô hướng Đồ thị G = gọi đồ thị vô hướng tất cạnh e  E mà cặp đỉnh thuộc e = (u,v)  V không phân biệt thứ tự Đồ thị vô hướng đồ thị khơng có cung Hình 1.3.a biểu diễn đồ thị vô hướng 1.2.2 Đồ thị có hướng Đồ thị G = gọi đồ thị có hướng tất cạnh e  E mà cặp đỉnh thuộc e = (u,v)  V có phân biệt thứ tự Đồ thị có hướng đồ thị mà e = (u,v)  V cung C B A Hình 2.1 Đồ thị có hướng 1.2.3 Đồ thị hỗn hợp Đồ thị G = vừa có cạnh vơ hướng, vừa có cạnh có hướng gọi đồ thị hỗn hợp Loại đồ thị dùng tới Vấn đề phân chia đồ thị thuật ngữ đồ thị mang tính tương đối, cịn chưa mang tính thống chuẩn nhiều tài liệu 1.3 Một số khái niệm tính chất đồ thị 1.3.1 Bậc đồ thị a Bậc đồ thị vô hướng Cho đồ thị vô hướng G = Xét đỉnh v  V đặt m(v) số cạnh thuộc đỉnh v m(v) gọi bậc đỉnh v Nếu v có khun m(v) cộng thêm v v m(v) = m(v) = - Nếu m(v) = đỉnh v gọi đỉnh cô lập - Nếu m(v) = đỉnh v gọi đỉnh treo Ta đặt m(G)   m(v) , vV m(G) gọi bậc đồ thị vô hướng G = b Bậc đồ thị có hướng Cho đồ thị có hướng G = xét đỉnh v  V, ký hiệu m+(v) số cung vào đỉnh v, m-(v) số cung khỏi v Khi ta gọi m+(v) bậc vào đỉnh v m-(v) bậc đỉnh v - Nếu m+(v) + m-(v) = đỉnh v gọi đỉnh cô lập - Nếu m+(v) + m-(v) = đỉnh v gọi đỉnh treo Ta đặt m(G)   m  (v)   m  (v) vV vV Khi m(G) gọi bậc đồ thị có hướng G = Trong đồ thị có hướng m+(v) = m-(v) = E Ví dụ: - Xét đồ thị vơ hướng Hình 1.3.a ta có: m(G) = m(A) + m(B) + m(C) + m(D) = + + + = 10 - Xét đồ thị có hướng Hình 2.1 ta có: m(G) = [m+(A) + m+(B) + m+(C) ] + [m-(A) + m-(B) + m-(C)] = [1 + + 1] + [2 + +1] = Định lý: Cho đồ thị hữu hạn G = bậc đồ thị G lần số cạnh đồ thị, tức m(G) = E Chứng minh: Ta thấy cạnh thuộc đỉnh, xố cạnh bậc G giảm 2, xoá khuyên e = (u,u) bậc G giảm 2, cịn xố hết cạnh, hết khun bậc đồ thị Từ suy định lý Hệ quả: Số đỉnh bậc lẻ đồ thị G = số chẵn Chứng minh: Gọi A B tương ứng tập đỉnh bậc lẻ tập đỉnh bậc chẵn đồ thị Ta có: 2m   m(v)   m(v)   m(v) vV vA vB Do vế trái chẵn nên tổng vế phải số chẵn Mà tổng bậc đỉnh bậc chẵn (v  A) số chẵn nên tổng bậc đỉnh bậc lẻ (v  B) phải số chẵn, tất số hạng số lẻ, nên tổng phải gồm số chẵn số hạng Vì số đỉnh bậc lẻ phải số chẵn 1.3.2 Đường chu trình a Đường Xét đồ thị G = với - Tập đỉnh V = {v1,v2, ,vn} - Tập cạnh E = {e1,e2, ,em} Tập hợp đỉnh kề từ vi đến vj gọi đường Kí hiệu: vivi1vi2 vj  vieivi1ei1vi2ei2 ejvj, cạnh, đỉnh đường lặp lại Độ dài đường số cạnh (hoặc cung) đường Chú ý đồ thị có hướng, cung uv chẳng hạn đường đi từ gốc (u) đến (v) ngược lại b Chu trình Xét đường từ vi - vj Nếu vi  vj đường gọi chu trình Như chu trình đường có đỉnh xuất phát đỉnh kết thúc trùng Chú ý đường đồ thị có hướng khơng ngược chiều mũi tên - Đường (chu trình) gọi đơn qua cạnh khơng q lần - Đường (chu trình) gọi sơ cấp qua đỉnh lần B A E C D Hình 3.1 Ví dụ Hình 3.1 ADBE đường sơ cấp từ A đến E độ dài 3; ABCDBE đường không sơ cấp (qua B lần) từ A đến E độ dài 5; ABDAB đường không đơn (chứa cạnh AB lần) từ A đến B độ dài 4; ABDA Là chu trình đơn sơ cấp độ dài 3; CC đường độ dài Xét đồ thị có hướng Hình 2.1 ABCB đường độ dài 3; CBA không đường khơng có cung từ B đến A Định lý: Nếu đồ thị G = đỉnh có bậc khơng nhỏ (v  V | m(v)  2) G tồn chu trình Chứng minh: Xét tất đường đơn Vì đồ thị hữu hạn số đường đơn hữu hạn Chọn đường dài ví dụ từ v i1 đến vij +1 (xem hình vẽ đây) Theo giả thiết m(v)  nên tồn đỉnh vi0 cạnh nối đỉnh vi1 vi0 Đỉnh vi0 thuộc đỉnh đường chọn chẳng hạn vij, đường dài nên chứng tỏ tồn chu trình đường 10 For j:=1 to n if (a[i,k] MaxInt ) and (a[k,j] MaxInt)then if a[i,k] + a[k,j] < a[i,j] then Begin a[i,j]:= a[i,k] + a[k,j]; p[i,j] := k; End; End; Procedure hienthi; Var i,j: Integer; {In duong di ngan nhat giua cap dinh (a,b) tu ma tran p[i,j]} Procedure duongdingannhat(a,b: Integer); Var k: Integer; Begin k:= p[a,b]; If k = then Exit; duongdingannhat(a,k); Write(k,'->'); duongdingannhat(k,b); End; Begin Writeln; Writeln('Do dai duong di ngan nhat giua cac cap dinh: '); For i:=1 to n Begin Writeln; For j:=1 to n Write(a[i,j]:9); End; Readln; Writeln('Duong di ngan nhat giua cac cap dinh: '); For i:=1 to n 39 Begin For j:=1 to n if i j then Begin if a[i,j]=MaxInt then writeln(' khong co duong di tu ',i:2,'den',j:2) else begin Write(i,'=>',j,': '); Write(i,'->'); duongdingannhat(i,j); Write(j); Writeln; writeln(' dai duong di tu',i:3,'den',j:3,' la:',a [i,j]:3); writeln(' -'); End; end; Writeln('Press Enter to continue '); Readln; writeln('****************************************************'); End; Readln; End; BEGIN NhapSoLieu; Indulieu; Ployd; hienthi; END 40 41 CHƢƠNG BÀI TỐN TÌM CHU TRÌNH EULER 3.1 Giới thiệu toán Thành phố Konigsberg thuộc phố (nay Kalinirngad thuộc cộng hoà Nga) Được chia làm vùng nhánh sông Pregel Các vùng gồm hai vùng bên bờ sông(B,C), đảo kneiphof(A) miền nằm nhánh sông Pregel(D) Vào kỷ XVIII, người ta xây dựng cầu nối vùng với Người dân tự hỏi: Liệu có cách xuất phát địa điểm thành phố, qua cầu, lần quay trở nơi xuất phát khơng? Nhà tốn học Thuỵ Sỹ Leonhard Eulrer giải toán coi ứng dụng lí thuyết đồ thị, ơng mơ hình hố sơ đồ cầu đa đồ thị, vùng biểu diễn đỉnh, cầu cạnh, Bài tốn đặt tìm đường qua cầu cầu lần tổng qt hố tốn : Có tồn chu trình đơn đa đồ thị chứa tất cạnh 3.2 Thuật toán Fleury a Thuật toán: Thuật toán Fleury tìm chu trình Euler đồ thị vơ hướng liên thơng, đỉnh có bậc chẵn đồ thị có hướng liên thơng yếu đỉnh có bán bậc bán bậc vào Xuất phát từ đỉnh, ta chọn cạnh liên thuộc với để nguyên tắc sau: - Xoá cạnh qua - Chỉ qua cầu khơng cịn cách khác để chọn 42 Chọn khơng tiếp tục nữa, đường tìm chu trình Euler Ví dụ với đồ thị sau: 8 Nếu xuất phát từ đỉnh có cách tiếp: Hoặc sang đỉnh sang đỉnh giả sử ta sang đỉnh xoá cạnh (1,2) vừa qua Từ có cách sang nên cho dù (2,4) cầu ta phải qua sau xố ln cạnh (2,4) Đến cạnh cịn lại đồ thị vẽ nét liền, cạnh bị xố vẽ nét đứt Bây đứng đỉnh ta có cách tiếp: Sang 4,sang sang Vì (4,3) cầu nên ta không theo cạnh (4,3) mà theo cạnh (4,5) (4,6) Nếu theo (4,5) tiếp tục ta chu trình 43 Euler là: (1,2,4,5,7,8,6,4,3,1) cịn theo (4,6) tìm chu trình Euler là: (1,2,4,6,8,7,5,4,3,1) b Chương trình Phần ta cài thuật toán Fleury đa đồ thị vô hướng Để đơn giản ta coi đồ thị có chu trình Euler, cơng việc phải tìm chu trình Input: File văn fleury.inp - Dòng 1: chứa số đỉnh đồ thị (n 0) then begin Inc(last); mang[Last]:=v; free[v]:=False; If free[x] then Break; end; 45 Until First> Last; Kiemtra:=not Free[x]; Inc(a[x,y]); Inc(a[y,x]); end; procedure chutrinh; var dinhdau,dinhtiep,Count,v:integer; Begin dinhdau:=m; write(m:5); count:=1; repeat Next:=0; for v:=1 to n if a[dinhdau,v]>0 then begin dinhtiep:=v; if kiemtra(dinhdau,v) then Break; end; If dinhtiep0 then Begin Dec(a[dinhdau,dinhtiep]); Dec(a[dinhtiep,dinhdau]); Write(dinhtiep:5); Inc(count); if count mod 16= then Writeln; 46 dinhdau:=dinhtiep; end; Until dinhtiep=0; Writeln; end; BEGIN assign(Input,'fleury.inp'); reset(Input); Assign(Output,'fleury.out'); Rewrite(Output); writeln(' chu trinh eu ler:'); Doc_tep; chutrinh; Close(Input); Close(Output); END 47 3.3 Tìm chu trình Euler sử dụng phƣơng pháp ngăn xếp a Thuật toán: -Bắt đầu từ chu trình đơn C, tìm đường cách tuỳ ý, ghi nhận đường vào chu trình từ đỉnh u bất kỳ, trở đỉnh u, qua cạnh xố ln cạnh khỏi đồ thị - Nếu tất cạnh bị xố ta chu trình Euler - Nếu khơng: + Rà sốt đỉnh C, đỉnh tìm thấy đỉnh u, cịn cạnh xuất phát từ u trở đỉnh u Trên đường đi, xoá cạnh qua ghi nhận lại +Thay đỉnh u C chu trình vừa tìm Thực tất cạnh xố ta chu trình Euler b Chương trình program Euler_Circuit; const max = 100; maxE = 20000; var a: array[1 max, max] of Integer; stack: array[1 maxE] of Integer; n,m, last: Integer; procedure Enter; var u, v, k: Integer; begin FillChar(a, SizeOf(a), 0); Readln(n,m); 48 while not SeekEof begin Readln(u, v, k); a[u, v] := k; a[v, u] := k; end; end; procedure Push(v: Integer); begin Inc(last); Stack[last] := v; end; function Pop: Integer; begin Pop := Stack[last]; Dec(last); end; function Get: Integer; begin Get := Stack[last]; end; procedure chutrinheuler ; var u, v, count: Integer; begin Stack[1] := m; last := 1; count := 0; 49 while last begin u := Get; for v := to n if a[u, v] > then begin Dec(a[u, v]); Dec(a[v, u]); Push(v); Break; end; if u = Get then begin Inc(count); Write(Pop:5, ' '); if count mod 16 = then Writeln; end; end; end; BEGIN Assign(Input, 'stack.inp'); Reset(Input); Assign(Output, 'stack.out'); Rewrite(Output); writeln(' chu trinh euler:'); Enter; Chutrinheuler; Close(Input); Close(Output); END 50 Hạn chế: Trong trường hợp xấu nhất, Stack phải lưu toàn số cạnh đồ thị Nên với đồ thị mà số cạnh lớn, sử dụng phương pháp Mở rộng: Phương pháp cịn áp dụng cho đồ thị có hướng Khi chu trình tìm bị ngược chiều cạnh Cần đảo ngược lại thứ tự đỉnh chu trình 51 KẾT LUẬN Đề tài “Một số tốn lí thuyết đồ thị” đạt kết nghiên cứu sau: Bài tốn tìm chu trình Euler thuật tốn Dijkstra, Ford-Bellman, ployd, Bài tốn tìm đường ngắn với thuật toán Fleury phương pháp sử dụng ngăn xếp, thực cài đặt chương trình với thuật toán Ứng dụng đồ thị thực tiễn quan trọng việc nghiên cứu số tốn lí thuyết đồ thị góp phần phát triển kĩ thuật tin học để giải số toán thực tế như: xác định xem hai máy tính mạng truyền tin hay khơng nhờ mơ hình đồ thị mạng máy tính, hay tốn nối mạng máy tính cho tổng chi phí nhỏ nhất, có ứng dụng đồ thị không trực tiếp vào lĩnh vực tin học, ví dụ tốn lập lich cơng tác, xác định đường ngắn điểm nút giao thơng, tốn mơ hình tốt đồ thị giải chúng dễ dàng máy tính Hướng phát triển: - Nghiên cứu toàn diện lí thuyết đồ thị - Với tốn cần đưa ứng dụng - Chương trình cài đặt cần tối ưu cho tất loại đồ thị 52 TÀI LIỆU THAM KHẢO Đỗ Đức Giáo, Toán Rời Rạc, NXB Đại Học Quốc Gia Hà Nội , năm 2002 Lê Minh Hoàng, Bài giảng chuyên đề Nguyễn Đức Nghĩa - Nguyễn Tô Thành, Toán Rời Rạc, NXB Giáo Dục 2005 53 ... đồ thị vô hướng tương ứng liên thông 1.3.4 Đồ thị đồ thị phận Cho đồ thị G = - Nếu đồ thị ta bỏ số đỉnh cạnh xuất phát từ đỉnh phần cịn lại đồ thị gọi đồ thị đồ thị G cho, D = đồ. .. dụ đồ thị 1.1.2 Đồ thị đơn Đồ thị G = gọi đồ thị đơn hai đỉnh nối với không cạnh (cung), tức đồ thị khơng có cạnh bội, khơng có khun (Hình 1.2 ví dụ đồ thị đơn) 2.1.3 Đa đồ thị Đồ thị. .. Hình 2.1 Đồ thị có hướng 1.2.3 Đồ thị hỗn hợp Đồ thị G = vừa có cạnh vơ hướng, vừa có cạnh có hướng gọi đồ thị hỗn hợp Loại đồ thị dùng tới Vấn đề phân chia đồ thị thuật ngữ đồ thị mang

Ngày đăng: 21/10/2021, 23:12

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan