TÀI LIỆU GIÁO KHOA CHUYÊN TIN QUYỂN 1
!" # $% & ' Công ty Cổ phần dịch vụ xuất Giáo dục H Nội Nh xuất Giáo dục Việt Nam giữ quyền công bố tác phẩm 349 2009/CXB/43 644/GD M4 sè : 8I746H9 L I NÓI ð U B Giáo d c ðào t o ban hành chương trình chun tin h c cho l p chuyên 10, 11, 12 D(a theo chun đ* chun sâu chương trình nói trên, tác gi biên so n b sách chuyên tin h c, bao g/m v1n ñ* b.n nh1t v* c1u trúc d3 li4u, thu5t tốn cài đ6t chương trình B sách g/m ba quy8n, quy8n 1, C1u trúc m;i quy8n bao g/m: ph=n lí thuy?t, gi i thi4u khái ni4m b.n, c=n thi?t tr(c ti?p, thưAng dùng nh1t; ph=n áp d ng, trình bày tốn thưAng g6p, cách gi.i cài đ6t chương trình; cuDi t5p Các chuyên ñ* b sách ñưEc l(a ch n mang tính h4 thDng tF b.n đ?n chun sâu V i tr.i nghi4m nhi*u năm tham gia gi.ng d y, b/i dưIng h c sinh chuyên tin h c cJa trưAng chun có truy*n thDng uy tín, tác gi ñã l(a ch n, biên so n n i dung b.n, thi?t y?u nh1t mà sK d ng đ8 d y h c v i mong muDn b sách ph c v không chM cho giáo viên h c sinh chuyên PTTH mà c cho giáo viên, h c sinh chuyên tin h c THCS làm tài li4u tham kh.o cho vi4c d y h c cJa V i kinh nghi4m nhi*u năm tham gia b/i dưIng h c sinh, sinh viên tham gia kì thi h c sinh giRi QuDc gia, QuDc t? H i thi Tin h c trT Toàn quDc, Olympiad Sinh viên Tin h c Tồn quDc, Kì thi l5p trình viên QuDc t? khu v(c ðơng Nam Á, tác gi l(a ch n gi i thi4u t5p, lAi gi.i có ñYnh hư ng ph c v cho không chM h c sinh mà c sinh viên làm tài li4u tham kh.o tham gia kì thi L=n đ=u t5p sách đưEc biên so n, thAi gian trình đ có h n ch? nên ch[c ch[n cịn nhi*u thi?u sót, tác gi mong nh5n đưEc ý ki?n ñóng góp cJa b n ñ c, ñ/ng nghi4p, sinh viên h c sinh ñ8 b sách ñưEc ngày hoàn thi4n Các tác gi Chun đ THU T TỐN VÀ PHÂN TÍCH THU T TỐN Thu t tốn Thu t tốn m t nh ng khái ni m quan tr ng nh t tin h c Thu t ng thu t toán xu t phát t nhà khoa h c Ar p Abu Ja'far Mohammed ibn Musa al Khowarizmi Ta có th+ hi+u thu t tốn dãy h u h n bư c, m i bư c mơ t xác phép tốn ho c hành ñ ng c"n th#c hi$n, ñ% gi i quy't m t v)n ñ* ð+ hi+u ñ.y ñ0 ý nghĩa c0a khái ni m thu t toán xem xét đ5c trưng sau c0a thu t tốn: • ð.u vào (Input): Thu t toán nh n d li u vào t m t t p • ð.u (Output): V>i m?i t p d li u đ.u vào, thu t tốn đưa d li u tương Bng v>i lCi giDi c0a toán • Chính xác: Các bư>c c0a thu t tốn đưGc mơ tD xác • H u hJn: Thu t tốn c.n phDi đưa đưGc đ.u sau m t sK h u hJn (có th+ r t l>n) bư>c v>i m i đ.u vào • ðơn trL: Các kMt quD trung gian c0a t ng bư>c thNc hi n thu t tốn đưGc xác đLnh m t cách đơn trL chO phP thu c vào ñ.u vào kMt quD c0a bư>c trư>c • TQng quát: Thu t tốn có th+ áp dPng đ+ giDi m i tốn có dJng cho ð+ bi+u diSn thu t tốn có th+ bi+u diSn bTng danh sách bư>c, bư>c đưGc diSn đJt bTng ngơn ng thơng thưCng kí hi u tốn h c; ho5c có th+ bi+u diSn thu t tốn bTng sơ ñV khKi Tuy nhiên, ñ+ ñDm bDo tính xác ñLnh c0a thu t tốn, thu t tốn c.n đưGc viMt bTng ngơn ng l p trình M t chương trình sN bi+u diSn c0a m t thu t tốn ngơn ng l p trình ch n Trong tài li u này, sY dPng ngôn ng tNa Pascal đ+ trình bày thu t tốn Nói tNa Pascal, b\i nhi]u trưCng hGp, đ+ cho ng^n g n, khơng hồn tồn tn theo quy đLnh c0a Pascal Ngơn ng Pascal ngơn ng đơn giDn, khoa h c, đưGc giDng dJy nhà trưCng phQ thơng Ví dP: Thu t tốn ki+m tra tính nguyên tK c0a m t sK nguyên dương viMt ngơn ng l p trình Pascal , is_prime(n):boolean; k:=2 to n (n mod k=0) exit(true); ; exit(false); Phân tích thu t tốn 2.1 Tính hi u qu c a thu t toán Khi giDi m t toán, c.n ch n sK thu t toán m t thu t toán mà cho “tKt” nh t V y dNa s\ ñ+ ñánh giá thu t tốn “tKt” thu t tốn kia? Thơng thưCng ta dNa hai ti+u chudn sau: Thu t tốn đơn giDn, dS hi+u, dS cài đ5t (dS viMt chương trình) Thu t tốn hi u quD: Chúng ta thưCng ñ5c bi t quan tâm ñMn thCi gian thNc hi n c0a thu t toán (g i đ phBc tJp tính tốn), bên cJnh quan tâm t>i dung lưGng không gian nh> c.n thiMt ñ+ lưu gi d li u vào, kMt quD trung gian q trình tính tốn Khi viMt chương trình chO đ+ sY dPng m t sK l.n tiêu chudn (1) quan tr ng, nMu viMt chương trình đ+ sY dPng nhi]u l.n, cho nhi]u ngưCi sY dPng tiêu chudn (2) lJi quan tr ng Trong trưCng hGp này, dù thu t tốn có th+ phDi cài đ5t phBc tJp, ta vin sj lNa ch n ñ+ nh n đưGc chương trình chJy nhanh hơn, hi u quD 2.2 T!i c#n thu t tốn có tính hi u qu ? Kĩ thu t máy tính tiMn b r t nhanh, ngày máy tính l>n có th+ đJt tKc đ tính tốn hàng nghìn tO phép tính m t giây V y có c.n phDi tìm thu t tốn hi u quD hay khơng? Chúng ta xem l!i ví d, tốn ki+m tra tính nguyên tK c0a m t sK nguyên dương is_prime(n):boolean; k:=2 to n (n mod k=0) exit(true); ; exit(false); DS dàng nh n th y rTng, nMu m t sK nguyên tK phDi m t phép phép toán GiD sY m t siêu máy tính có th+ tính đưGc trăm nghìn tO 10 m t giây, v y ñ+ ki+m tra m t sK khoDng 25 ch sK m t khoDng đMn ~3170 năm Trong đó, nMu ta có nh n xét vi c thY khơng c.n thiMt mà chO c.n thY is_prime(n):boolean; t ñMn √ , ta có: t for k:=2 to trunc(sqrt(n)) if (n mod k=0) (false); exit(true); ; {hàm sqrt(n) hàm tính √ , trunc(x) hàm làm trịn x } Như v y ñ+ ki+m tra m t sK khoDng 25 ch sK m t khoDng !" # ~0.03 giây! 2.3 ðánh giá th0i gian th1c hi n thu t tốn Có hai cách tiMp c n đ+ đánh giá thCi gian thNc hi n c0a m t thu t toán Cách thB nh t bTng thNc nghi m, viMt chương trình cho chJy chương trình v>i d li u vào khác m t máy tính Cách thB hai bTng phương pháp lí thuyMt, coi thCi gian thNc hi n thu t toán hàm sK c0a cp d li u vào (cp c0a d li u vào m t tham sK đ5c trưng cho d li u vào, có Dnh hư\ng quyMt đLnh đMn thCi gian thNc hi n chương trình Ví dP đKi v>i tốn ki+m tra sK nguyên tK cp c0a d li u vào sK c.n ki+m tra; hay v>i toán s^p xMp dãy sK, cp c0a d li u vào sK ph.n tY c0a dãy) Thông thưCng cp c0a d li u vào m t sK nguyên dương , ta sY dPng hàm sK % cp c0a d li u vào ñ+ bi+u diSn thCi thNc hi n c0a m t thu t toán Xét ví dP tốn ki+m tra tính ngun tK c0a m t sK nguyên dương (cp d li u vào ), nMu m t sK chrn & chO c.n m t l.n thY chia đ+ kMt lu n không phDi sK nguyên tK NMu & không chia hMt cho lJi chia hMt cho c.n l.n thY (chia chia 3) đ+ kMt lu n khơng ngun tK Cịn nMu m t sK ngun tK thu t toán phDi thNc hi n nhi]u l.n thY nh t Trong tài li u này, hi+u hàm sK % thCi gian nhi]u nh t c.n thiMt đ+ thNc hi n thu t tốn v>i m i b d li u ñ.u vào cp SY dPng kí hi u tốn h c l>n đ+ mơ tD đ l>n c0a hàm % GiD sY m t sK nguyên dương, % ' hai hàm thNc không âm Ta viMt % () ' nMu chO nMu tVn tJi hTng sK dương * , cho % + * ' , v>i m i NMu m t thu t toán có thCi gian thNc hi n % thu t tốn có thCi gian thNc hi n c p ' Ví d,: GiD sY % V y% c p () ( , , ta có ,2 + () ' ,2 nói rTng (3 v>i m i , trưCng hGp ta nói thu t tốn có thCi gian thNc hi n 2.4 Các quy t5c ñánh giá th0i gian th1c hi n thu t tốn ð+ đánh giá thCi gian thNc hi n thu t tốn đưGc trình bày bTng ngơn ng tNa Pascal, ta c.n biMt cách ñánh giá thCi gian thNc hi n câu l nh c0a Pascal Trư>c tiên, xem xét câu l nh Pascal Các câu l nh Pascal ñưGc ñLnh nghĩa ñ quy sau: Các phép gán, ñ c, viMt câu l nh (ñưGc g i l nh ñơn) NMu S1, S2, , Sm câu l nh Begin S1; S2; …; Sm; End; câu l nh (ñưGc g i l nh hGp thành hay khKi l nh) NMu S1 S2 câu l nh E bi+u thBc lơgic If E then S1 else S2; câu l nh (ñưGc g i l nh rj nhánh hay l nh If) NMu S câu l nh E bi+u thBc lơgic E S; câu l nh (ñưGc g i l nh l5p ñi]u ki n trư>c hay l nh While) NMu S1, S2,…,Sm câu l nh E bi+u thBc lơgic Repeat S1; S2; …; Sm; Until E; câu l nh (ñưGc g i l nh l5p ñi]u ki n sau hay l nh Repeat) NMu S l nh, E1 E2 bi+u thBc m t ki+u thB tN đMm đưGc For i:=E1 to E2 S; câu l nh (ñưGc g i l nh l5p v>i sK l.n xác ñLnh hay l nh For) ð+ đánh giá, phân tích chương trình xu t phát t l nh đơn, rVi ñánh giá l nh phBc tJp hơn, cuKi ñánh giá ñưGc thCi gian thNc hi n c0a chương trình, cP th+: ThCi gian thNc hi n l nh ñơn: gán, ñ c, viMt ) L nh hGp thành: giD sY thCi gian thNc hi n c0a S1, S2,…,Sm tương Bng ,) ' , , ) ' Khi thCi gian thNc hi n c0a l nh hGp ) ' ,' , … , ' thành là: ) /0 ' L nh If: giD sY thCi gian thNc hi n c0a S1, S2 tương Bng ) ' ,) ' Khi thCi gian thNc hi n c0a l nh If là: ) /0 ' ,' L nh l5p While: giD sY thCi gian thNc hi n l nh S (thân c0a l nh While) ) ' sK l.n l5p tKi đa thNc hi n l nh S Khi thCi gian thNc hi n l nh While ) ' L nh l5p Repeat: giD sY thCi gian thNc hi n khKi l nh ) ' Repeat ) ' Begin S1; S2;…; Sm; End; sK l.n l5p tKi ña Khi ñó thCi gian thNc hi n l nh L nh l5p For: giD sY thCi gian thNc hi n l nh S ) ' l.n l5p tKi ña Khi ñó thCi gian thNc hi n l nh For ) ' 2.5 M:t s; ví d, 2 sK Ví d, 1: Phân tích thCi gian thNc hi n c0a chương trình sau: var i, j, n :longint; s1, s2 :longint; BEGIN {1} readln(n); {2} s1:=0; {3} for i:=1 to n {4} s1:=s1 + i; {5} s2:=0; {6} {7} {8} {9} END for j:=1 to n s2:=s2 + j*j; writeln('1+2+ +',n,'=',s1); writeln('1^2+2^2+ +',n,'^2=',s2); ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {1}, {2}, {4}, {5}, {7}, {8}, {9} có thCi gian thNc hi n ) L nh l5p For {3} có sK l.n l5p , v y l nh {3} có thCi gian thNc hi n ) Tương tN l nh l5p For {6} có thCi gian thNc hi n ) V y thCi gian thNc hi n c0a chương trình là: max ) , ) , ) ,) ,) ,) ,) () Ví d, 2: Phân tích thCi gian thNc hi n c0a đoJn chương trình sau: {1} {2} {3} {4} {5} {6} c:=0; for i:=1 to 2*n c:=c+1; for i:=1 to n for j:=1 to n c:=c+1; ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {1}, {3}, {6} có thCi gian thNc hi n ) L nh l5p For {2} có sK l.n l5p , v y l nh {2} có thCi gian thNc hi n ) L nh l5p For {5} có sK l.n l5p , v y l nh {5} có thCi gian thNc hi n ) L nh l5p For {4} có sK l.n l5p , v y l nh {4} có thCi gian thNc hi n ) V y thCi gian thNc hi n c0a ñoJn chương trình là: max ) , ) ,) () Ví d, 3: Phân tích thCi gian thNc hi n c0a đoJn chương trình sau: {1} {2} {3} for i:=1 to n for j:=1 to i c:=c+1; ThCi gian thNc hi n chương trình phP thu c vào sK Các l nh {3} có thCi gian thNc hi n ) 10 Sample Input Sample Output 1 2 3 4 5 3 5 5 1 4 Ngoài thao tác đ i v8i ngăn xAp, thu t tốn tìm chu trình Euler cịn u cWu cài đ*t hai thao tác sau m t cách hi$u qu=: • V8i m`i đ/nh ki m tra xem có t n t5i c5nh liên thu c v8i hay khơng, nAu có ch/ m t c5nh liên thu c Lo5i bb m t c5nh khbi ñ th Các c5nh c;a ñ th ñư c ñánh s tD t8i I, sau m`i c5nh vơ hư8ng J, K sa đư c thay thA bei hai cung có hư8ng ngư c chiBu: J, K K, J M`i cung m t b=n ghi g m hai ñ/nh ñWu mút ch/ s c5nh vơ hư8ng tương Kng • const maxM = 1000000; type TArc = record x, y: Integer; //cung (x, y) edge: Integer; //ch s c nh vô hư:ng tương 1ng end; var a: array[1 * maxM] of TArc; Danh sách liên thu c ñư c xây dLng theo ki u reverse star: M`i ñ/nh cho tương Kng v8i m t danh sách cung ñi vào Các danh sách ñư c cho bei hai m=ng lm1 … n s 4m1 … 2In đó: • • lm n ch/ s cung đWu tiên danh sách liên thu c cung ñi vào , trưTng h p đ/nh khơng cịn cung vào, lm n ñư c gán bZng s 4m n ch/ s cung kA tiAp cung / danh sách liên thu c chKa cung / , trưTng h p / cung cu i m t danh sách liên thu c, s 4m n ñư c gán bZng 205 ð thLc hi$n thao tác xố c5nh, ta trì m t m=ng đánh dCu l s lm1 … In l s lm n True nAu c5nh vơ hư8ng thK b xố M`i c5nh vơ hư8ng b xố, c= hai cung có hư8ng tương Kng đBu khơng cịn t n t5i, vi$c ki m tra m t cung có hư8ng / cịn t n t5i hay khơng có th thLc hi$n bZng vi$c ki m tra: l s lm / lă n ? False Chỳng ta sa ci ủ*t thao tác sau cCu trúc d% li$u: • • • Hàm : Tr= vB phWn tX nZm e ñ/nh ngăn xAp Hàm Pop: Tr= vB phWn tX nZm e đ/nh ngăn xAp rút phWn tX khbi ngăn xAp Th; tRc Push v : ð•y m t ñ/nh vào ngăn xAp TCt c= thao tác trên ngăn xAp có th cài đ*t đ thLc hi$n thTi gian ¬ Thu t tốn tìm chu trình Euler có th viAt cR th hơn: Stack := (1); //Khli t3o ngăn xLp ch0 chwa m8t ñ0nh repeat u := Get; //ðSc ñ0nh u tP ngăn xLp i := head[u]; //Xét cung a[i] ñwng ñ5u danh sách liên thu8c cung ñi vào u while (i > 0) and (deleted[a[i].edge]) //cung a[i] wng vOi c3nh vô hưOng xố i := link[i]; //D]ch sang cung kL tiLp head[u] := i; //Nhrng cung ñã duyTt qua b] lo3i ngay, c~p nh~t l3i ch0 s2 ñ5u danh sách liên thu8c if i > then //u cung vào wng vOi c3nh vơ hưOng chưa xố begin Push(a[i].x); //ðsy ñ0nh n2i tOi u vào ngăn xLp (ñi ngưmc cung a[i]) Deleted[a[i].edge] := True; //Xố c3nh vơ hưOng wng vOi cung a[i] end else Output ← Pop; until Top = 0; //Lop tOi ngăn xLp rpng Xét vịng l*p repeat…until, m`i bư8c l*p có m t thao tác ( ho*c ( ñư c thLc hi$n M`i lWn thao tác ( đư c thLc hi$n ph=i có m t c5nh vơ hư8ng b xố ngăn xAp có thêm m t đ/nh M`i lWn thao tác ( ñư c thLc hi$n ngăn xAp b b8t ñi m t đ/nh Vì thu t tốn in I đ/nh chu trình Euler nên sa ph=i có t_ng c ng I thao tác ( Trư8c vào vịng l*p ngăn xAp có m t 206 ñ/nh vòng l*p kAt thúc ngăn xAp tre thành r`ng, suy s thao tác ( ph=i I TD đó, vịng l*p repeat…until thLc hi$n 2I lWn TiAp theo ta ñánh giá s thao tác duy$t danh sách liên thu c c;a ñ/nh Bei sau vịng l*p while có l$nh c p nh t lm n x nên có th thCy rZng l$nh gán x s 4m n ñư c thLc hi$n lWn danh sách liên thu c c;a b gi=m ñúng chDng ñó cung T_ng s phWn tX c;a danh sách liên thu c 2I thu t toán kAt thúc, danh sách liên thu c ñBu r`ng Suy t_ng thTi gian thLc hi$n phép duy$t danh sách liên thu c (vòng l*p while) tồn b thu t tốn Θ I Suy thTi gian thLc hi$n gi=i thu t Θ I EULER.PAS Tìm chu trình Euler đa đ4 th5 Euler vô hư ng {$MODE OBJFPC} program EulerTour; const maxN = 100000; maxM = 1000000; type TArc = record //C$u trúc m t cung x, y: Integer; //Đ nh ñ2u ñ nh cu i edge: Integer; //Ch s c nh vô hư:ng tương 1ng end; var n, m: Integer; a: array[1 * maxM] of TArc; //Danh sách cung link: array[1 * maxM] of Integer; //link[i]: Ch s cung k ti p a[i] danh sách liên thu c head: array[1 maxN] of Integer; //head[u]: ch s cung ñ2u tiên danh sách cung vào u deleted: array[1 maxM] of Boolean; //Đánh d$u c nh vơ hư:ng b% xố hay chưa Stack: array[1 maxM + 1] of Integer; //Ngăn x p Top: Integer; //Ph2n ta ñ nh ngăn x p procedure Enter; //Nh)p d* li+u xây dNng danh sách liên thu c var i, j, u, v: Integer; begin ReadLn(n, m); j := * m; for i := to m 207 begin ReadLn(u, v); //Đ,c m t c nh vơ hư:ng, thêm cung có hư:ng tương 1ng a[i].x := u; a[i].y := v; a[i].edge := i; a[j].x := v; a[j].y := u; a[j].edge := i; Dec(j); end; FillChar(head[1], n * SizeOf(head[1]), 0); //KhAi t o danh sách liên thu c rBng for i := * m downto with a[i] //Duy+t t5ng cung (x, y) begin //Đưa cung vào danh sách liên thu c cung ñi vào y link[i] := head[y]; head[y] := i; end; FillChar(deleted[1], n * SizeOf(deleted[1]), False); //Các c nh vơ hư:ng đ!u chưa xố end; procedure FindEulerTour; var u, i: Integer; begin Top := 1; Stack[1] := 1; //KhAi t o ngăn x p ch1a ñ nh repeat u := Stack[Top]; //ð,c ph2n ta A ñ nh ngăn x p i := head[u]; //Cung a[i] ñang ñ1ng ñ2u danh sách liên thu c while (i > 0) and (deleted[a[i].edge]) i := link[i]; //D%ch ch s i d,c danh sách liên thu c đQ tìm cung 1ng v:i c nh vơ hư:ng chưa xố head[u] := i; //C)p nh)t l i head[u], "nh"y" qua cung 1ng v:i c nh vơ hư:ng xố if i > then //u cung vào 1ng v:i c nh vơ hư:ng chưa xố begin Inc(Top); Stack[Top] := a[i].x; //Đi ngư=c cung a[i], đGy ñ nh n i t:i u vào ngăn x p Deleted[a[i].edge] := True; //Xoá c nh vô hư:ng tương 1ng v:i a[i] end else //u khơng cịn cung vào begin Write(u, ' '); //In u chu trình Euler Dec(Top); //L$y u khMi ngăn x p end; until Top = 0; //L^p t:i ngăn x p rBng WriteLn; 208 end; begin Enter; FindEulerTour; end d) Vài nh(n xét BZng vi$c quan sát ho5t đ ng c;a ngăn xAp, có th sXa mơ hình cài đ*t c;a thu t tốn nhZm t n dRng ngăn xAp c;a chương trình ñ$ quy chK không cWn cài ñ*t cCu trúc d% li$u ngăn xAp ñ chKa ñ/nh: procedure Visit(u: Integer); var i: Integer; begin i := head[u]; while i ≠ begin //Xét cung a[i] vào u if not deleted[a[i].edge] then //C nh vô hưYng tương Sng chưa b xố begin deleted[a[i].edge] := True; //Xố c nh vơ hưYng tương Sng Visit(a[i].x); //ði ngưZc chi u cung a[i] thăm ñ%nh n1i tYi u end; end; Output ← u; //T\ u khơng th= ngưZc chi u cung nJa, in u chu trình Euler end; begin «Nh~p ñ\ th] xây d‚ng danh sách liên thu8c»; Visit(1); //KhHi đ"ng thu(t tốn tìm chu trình Euler end Cách cài đ*t đơn gi=n thao tác ngăn xAp ñư c thLc hi$n tL nhiên qua chA g4i th; tRc đ$ quy Tuy nhiên cWn ý rZng ñ sâu c;a dây chuyBn ñ$ quy có th lên t8i I cCp nên v8i m t s cơng cR l p trình cWn ñ*t l5i dung lư ng b nh8 Stack1 Chúng ta có th liên h$ thu t tốn v8i thu t tốn tìm kiAm theo chiBu sâu: TD mơ hình DFS, nAu thay thăm đ)nh thăm c/nh (m t c5nh có th tiAp sang c5nh chung đWu mút v8i nó) ð ng thTi ta ñánh dCu c5nh ñã qua/chưa Trong Free Pascal 32 bit, dung lư ng b nh8 Stack dành cho biAn ñ a phương tham s chương trình m*c ñ nh 64 KiB Có th ñ*t l5i bZng d•n hư8ng biên d ch {$M…} 209 qua thay cho chA ñánh dCu m t ñ/nh ñã thăm/chưa thăm Khi th= tZ duyLt xong (finish) c;a c5nh cho ta m t chu trình Euler Thu t tốn khơng có sai nAu ta xây dLng danh sách liên thu c ki u forward star thay ki u reverse star Tuy nhiên ta ch4n ki u reverse star bei cách bi u di n thích h p đ tìm chu trình Euler c= đ th vơ hư8ng có hư8ng NgưTi ta cịn có thu t tốn Fleury (1883) đ tìm chu trình Euler bZng tay: B@t ñWu tD m t ñ/nh, ñi tho=i mái theo c5nh theo nguyên t@c: xoá bb c5nh ñi qua ch/ ñi qua cWu khơng cịn cách khác đ ch4n Khi khơng th ñi tiAp ñư c n%a ñưTng ñi tìm ñư c chu trình Euler BZng cách “l5m dRng thu t ng%”, ta có th mơ t= đư c thu t tốn tìm Fleury cho c= đ th Euler có hư8ng vơ hư8ng: • • Dư8i nAu ta nói c5nh , hi u c5nh , đ th vơ hư8ng, hi u cung , đ th có hư8ng Ta g4i c5nh , “m t khơng tre l5i” nAu tD t8i , sau xố c5nh khơng có cách tD quay l5i Thu t tốn Fleury tìm chu trình Euler: XuCt phát tD m t ñ/nh, ta ñi m t cách tuỳ ý theo c5nh tuân theo hai nguyên t@c: Xoá bb c5nh vDa ñi qua ch/ ch4n c5nh “m t ñi khơng tre l5i” nAu khơng cịn c5nh khác ñ ch4n Thu t toán Fleury m t thu t tốn thích h p cho vi$c tìm chu trình Euler bZng tay (v8i nh%ng ñ th va ñư c m*t phhng vi$c ki m tra cWu bZng m@t thưTng tương ñ i d dàng) Tuy v y cài đ*t thu t tốn máy tính thu t tốn tb khơng hi$u qu= 6.2 ð th Hamilton a) Bài toán Khái ni$m vB đưTng chu trình Hamilton đư c đưa bei William Rowan Hamilton (1856) ông thiAt kA m t trị chơi kh i đa di$n 20 ñ/nh, 30 c5nh, 12 m*t, m`i m*t m t ngũ giác ñBu ngưTi chơi cWn ch4n c5nh ñ thành l p m t ñưTng ñi qua ñ/nh cho trư8c (Hình 5Q30) ð th , ñư c g4i ñ th Hamilton (Hamiltonian graph) nAu t n t5i chu trình đơn qua tCt c= đ/nh Chu trình đơn qua tCt c= đ/nh đư c g4i chu trình Hamilton (Hamiltonian Circuit/Hamiltonian Circle) ð thu n ti$n, ngưTi ta quy ư8c rZng ñ th ch/ g m ñ/nh ñ th Hamilton, ñ th g m ñ/nh liên thông không ph=i ñ th Hamilton 210 ð th , ñư c g4i ñ th n#a Hamilton (traceable graph) nAu t n t5i ñưTng ñi ñơn qua tCt c= ñ/nh ðưTng ñi ñơn ñi qua tCt c= ñ/nh ñư c g4i đư8ng Hamilton (Hamiltonian Path) Hình 30 b c a b e d d c a b c e d a + f D Trong Hình 5Q31, ð th + có chu trình Hamilton ) , , , l, , khơng có chu trình Hamilton có đưTng Hamilton ) , , , l D khơng có c= chu trình Hamilton l•n đưTng Hamilton Hình 31 b) Các đ nh lí liên quan TD ñ nh nghĩa ta suy ñư c ñ th ñưTng c;a ñ th Euler m t đ th Hamilton Ngồi nh%ng đ nh lí sau ñây cho vài cách nh n biAt ñ th Hamilton ð nh lí 20 ð th vơ hư ng G, t n t/i ñ)nh cho n9u xoá ñi ñ)nh v i nhhng c/nh liên thu c c7a chúng ñ th nh n ñư:c s+ có nhi u thành ph-n liên thơng kh