Tai lieu on thi HSG lop 11 so 3

5 16 0
Tai lieu on thi HSG lop 11 so 3

Đang tải... (xem toàn văn)

Thông tin tài liệu

Bµi to¸n t×m c©y khung ng¾n nhÊt lµ mét bµi to¸n gÆp trong thùc tÕ : ThÝ dô : X©y dùng m¹ng d©y ®iÖn tho¹i nèi N thµnh phè sao cho 2 thµnh phè bÊt kú liªn lạc đợc với nhau và tổng đờng d[r]

(1)PhÇn C©y - C¢y khung ng¾n nhÊt I / §Þnh nghÜa : Cây là đồ thị hữu hạn , vô hớng , liên thông , không có chu trình , có ít đỉnh II / TÝnh chÊt : - §Þnh lý : Nếu H là cây có N đỉnh thì H có các tính chất sau đây : a) Thêm vào H cạnh nối đỉnh không kề , H xuất chu trình b) Bít ®i c¹nh H th× H kh«ng liªn th«ng c) Giữa đỉnh H luôn tồn đờng ( H là đồ thị đơn) d) H cã N-1 c¹nh - §Þnh lý : Nêú đồ thị G liên thông có N đỉnh và N-1 cạnh thì G là cây Vậy cây là đồ thị liên thông có chu số ( suy từ công thức Ơle ) - Ghi chó : Từ đồ thị có thể hình thành nhiều cây khác ( gọi là các cây khung đồ thị ) Trong số các cây khung đồ thị , có cây đợc tạo cách đơn giản nh sau : nối đỉnh với n-1 đỉnh còn lại ! Số cây khung đồ thị đầy đủ là N n-2 ( N số đỉnh ) Số cây khung đồ thị có hữu hạn đỉnh là số hữu hạn ,nên luôn tìm đợc ít cây khung có tổng độ dài nhỏ ( nguyên lý biên ) Ta gọi cây khung này là cây khung ng¾n nhÊt Bµi to¸n t×m c©y khung ng¾n nhÊt lµ mét bµi to¸n gÆp thùc tÕ : ThÝ dô : X©y dùng m¹ng d©y ®iÖn tho¹i nèi N thµnh phè cho thµnh phè bÊt kú liªn lạc đợc với và tổng đờng dây điện ngắn Đó là bài toán tìm cây khung ngắn nhÊt Ngîc l¹i : X©y dùng m¹ng d©y ®iÖn tho¹i nèi N thµnh phè cho thµnh phè bÊt kỳ liên lạc đợc với và tổng độ tin cậy trên các đờng dây điện là lớn Đó là bài to¸n t×m c©y khung dµi nhÊt III / ThuËt to¸n Prim t×m c©y khung nhá nhÊt : Bớc : Khởi trị - Lấy đỉnh i tuỳ ý đa vào tập đỉnh cây Khi đó tập đỉnh cây là Đ = {i } TËp c¹nh cña c©y lµ C =  ( TËp rçng ) Bớc : Gán nhãn - Với đỉnh k không thuộc Đ , ta gán cho nó nhãn k(i ,d ) đó i là tên đỉnh thuộc Đ ,kề với k , gần k , còn d là khoảng cách i và k Nếu Đ không tìm đợc đỉnh i kề với k thì gán cho k nhãn k( , ) Bớc : Kết nap - Chọn đỉnh k không thuộc tập Đ , có nhãn d nhỏ , kết nạp k vào § VËy § = § + { k } Nh·n cña k lµ k( i ,d ) th× kÕt n¹p c¹nh ( i , k ) vµo tËp c¹nh C Vậy C = C + { cạnh ( i , k ) } Gọi đỉnh k vừa kết nạp là i0 Nếu số đỉnh Đ N thì kết thúc , còn không chuyển sang bớc Bớc : Sửa nhãn - Với đỉnh k cha thuộc Đ có nhãn là k( i, d ) mà k kề với i - là đỉnh vừa đợc kết nạp vào tập đỉnh bớc - ta sửa lại nhãn k theo nguyên tắc sau : Gọi độ dµi cung (i0 ,k ) lµ e Nếu d > e thì đỉnh k có nhãn là k( i , e ) (2) i0 (i0,10) i e=15 i0 Nh·n míi k (i0,15) k (i,23) +) i0 : võa kÕt n¹p vµo § , k : kh«ng thuéc § ThÝ dô : File d÷ liÖu vµo : PRIM.INT 16 12 0 16 12 12 13 16 10 12 13 0 27 16 0 16 0 10 16 12 16 13 12 10 16 File d÷ liÖu : PRIM.OUT ( 1, 3)= ( 3, 56)= 10 ( 6, 4)= ( 3, 2)= 12 ( 2, 5)= Tong gia tri cay khung ngan nhat la 37 Uses Crt; Const Fi = 'prim.txt'; Fo = 'prim.out'; Max = 200; Var A : Array[1 Max,1 Max] of Byte; D : Array[1 Max] of Boolean; C : Array[0 Max] of record x1,x2 : Byte; end; Nh : Array[1 Max] of record truoc,giatri : Byte; end; N,dd,socanh : Byte; {canh : Integer;} { } Procedure DocF; Var f : Text; i,j : Byte; Begin Assign(f,fi); Reset(f); Readln(f,n); For i:=1 to n Begin 16 (3) For j:=1 to n read(f,a[i,j]); Readln(f); End; Close(f); End; { } Procedure Napdinh1; Begin Fillchar(d,sizeof(d),False); d[1] := True; dd := 1; End; { } Function Min(xj : Byte): Byte; Var xi,p,i : Byte; Begin xi := 0; p := 255; For i:=1 to N If d[i] then If (p>a[i,xj]) and (a[i,xj]>0) then Begin xi := i; p := a[i,xj]; End; Min := xi; End; { } Procedure Gannhan; Var xi,xj : Byte; Begin For xj:=1 to N If not d[xj] then Begin xi := Min(xj); If (xi>0) and (A[xi,xj]>0) then Begin nh[xj].truoc := xi; nh[xj].giatri:= A[xi,xj]; End Else If xi=0 then Begin nh[xj].truoc := 0; nh[xj].giatri:= 255; End; End; End; { } Procedure Ketnapthem; Var p,j,xj : Byte; Begin p := 255; For j:=1 to n If not d[j] then Begin If (nh[j].giatri<p) then Begin xj := j; p := nh[j].giatri; End; (4) End; d[xj] := True; Inc(socanh); c[socanh].x1 := nh[xj].truoc; c[socanh].x2 := xj; dd := xj; End; { } Procedure Suanhan; Var xj : Byte; Begin For xj:=1 to N If (not D[xj]) and (A[xj,dd]>0) then Begin If Nh[xj].giatri>A[xj,dd] then Begin Nh[xj].truoc := dd; Nh[xj].giatri:= A[xj,dd]; End; End; End; { } Procedure Hiencanh; Var i,p : Byte;f : Text; Begin Assign(f,fo); Rewrite(f);p:=0; For i:=1 to n-1 Begin p := A[c[i].x1,c[i].x2]+p; Write(f,'(',c[i].x1:2,',',c[i].x2:2,')=',A[c[i].x1,c[i].x2]:3,' ':3); End; Writeln(f); Writeln(f,'Tong gia tri cay khung ngan nhat la ',p); Close(f); End; { } Procedure TT_Prim; Var Ok : Boolean; Begin SoCanh := 0; Fillchar(nh,sizeof(nh),0); Napdinh1; Gannhan; Ok := False; Repeat Ketnapthem; If Socanh=N-1 then Ok:= True Else Suanhan; Until Ok; Hiencanh; End; { } BEGIN Clrscr; DocF; TT_Prim END (5) PhÇn Tìm đờng ngắn (6)

Ngày đăng: 16/06/2021, 18:07

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

Tài liệu liên quan