Th ut toán Prim

Một phần của tài liệu cơ sở kỷ thuật lập trình (Trang 123)

Thu t toán Kruskal làm vi c kém hi u qu đ i v i nh ng đ th có s c nh kho ng

m=n(n-1)/2. Trong nh ng tình hu ng nh v y, thu t toán Prim t ra hi u qu h n. Thu t toán Prim còn đ c mang tên là ng i láng gi ng g n nh t. Trong thu t toán này, b t đ u t i m t đnh tu ý s c a đ th , n i s v i đnh y sao cho tr ng s c nh c[s, y] là nh nh t. Ti p theo, t đnh s ho c y tìm c nh có đ dài nh nh t, đi u này d n đ n đnh th ba z và ta thu đ c cây b ph n g m 3đnh 2 c nh. Quá trình đ c ti p t c cho t i khi ta nh n đ c cây g m n-1 c nh, đó chính là cây bao trùm nh nh t c n tìm.

Trong quá trình th c hi n thu t toán, m i b c, ta có th nhanh chóng ch n đnh và c nh c n b sung vào cây khung, các đnh c a đ th đ c s đ c gán các nhãn. Nhãn c a m t đnh v g m hai ph n, [d[v], near[v]]. Trong đó, ph n th nh t d[v] dùng đ ghi nh n đ dài c nh nh nh t trong s các c nh n i đnh v v i các đnh c a cây khung đang xây d ng. Ph n th hai, near[v] ghi nh n đnh c a cây khung g n v nh t. Thu t toán Prim đ c mô t thông qua th t c sau:

void Prim(void) { (*b c kh i t o*) Ch n s là m t đnh nào đó c a đ th ; VH = { s }; T = φ; d[s] = 0; near[s] = s; For v∈ V\VH { D[v] = C[s, v]; near[v] = s; } (* B c l p *) Stop = False; While (! stop) {

Tìm u∈ V\VH tho mãn : d[u] = min { d[v] v i u∈V\VH}; VH = VH∪ {u}; T = T ∪ {u, near[u] };

If (| VH | == n ) { H = (VH, T) là cây khung nh nh t c a đ th ; Stop := TRUE; } Else For (v ∈ V\VH ) { If (d[v] > C[u, v]) { D[v] = C[u, v]; Near[v] = u; } } } 5.7. BÀI TOÁN TÌM NG I NG N NH T 5.7.1. Phát bi u bài toán

Xét đ th có h ng G=<V, E>; trong đó | V| = n, | E | = m. V i m i cung (u,v)E, ta đ t t ng ng v i nó m t s th c A(u,v) đ c g i là tr ng s c a cung. Ta s đ t

A[u,v]=∞ n u (u,v)E. N u dãy v0, v1, . . . , vk là m t đ ng đi trên G thì [ , ]

1 1

∑= −

p

i Avi vi

đ c g i là đ dài c a đ ng đi.

Bài toán tìm đ ng đi ng n nh t trên đ th có h ng d i d ng t ng quát có th đ c phát bi u d i d ng sau: tìm đ ng đi ng n nh t t m t đnh xu t phát sV (đnh ngu n) đ n đnh cu i tV (đnh đích). ng đi nh v y đ c g i là đ ng đi ng n nh t t

s đ n t, đ dài c a đ ng đi d(s,t) đ c g i là kho ng cách ng n nh t t s đ n t (trong tr ng h p t ng quát d(s,t) có th âm). N u nh không t n t i đ ng đi t sđ n t thì đ dài đ ng đi d(s,t)=∞. N u nh m i chu trình trong đ th đ u có đ dài d ng thì trong đ ng đi ng n nh t s không có đnh nào b l p l i, đ ng đi nh v y đ c g i là đ ng đi c b n. N u nh đ th t n t i m t chu trình nào đó có đ dài âm , thì đ ng đi ng n nh t có th

không xác đnh, vì ta có th đi qua chu trình âm đó m t s l n đ l n đ đ dài c a nó nh h n b t k m t s th c cho tr c nào.

5.7.2. Thu t toán Dijkstra

Thu t toán tìm đ ng đi ng n nh t t đnh sđ n các đnh còn l i đ c Dijkstrađ ngh áp d ng cho tr ng h p đ th có tr ng s không âm. Thu t toán đ c th c hi n trên c s gán nhãn t m th i cho các đnh. Nhãn c a m i đnh cho bi t c n trên c a đ dài đ ng đi ng n nh t t i đnh đó. Các nhãn này s đ c bi n đ i (tính l i) nh m t th t c l p, mà m i b c l p m t s đnh s có nhãn không thay đ i, nhãn đó chính là đ dài đ ng đi ng n nh t t s đ n đnh đó. Thu t toán có th đ c mô t b ng th t c Dijkstra

nh sau:

void Dijkstra(void) {

(* u vào G=(V, E) v i n đnh có ma tr n tr ng s A[u,v]≥ 0; s∈V *) (* u ra là kho ng cách nh nh t t s đ n các đnh còn l i d[v]: v∈V. Truoc[v] ghi l i đnh tr c v trong đ ng đi ng n nh t t s đ n v*) (* B c 1: Kh i t o nhãn t m th i cho các đnh*) for (v=1; v≤n; v++){ d[v] = A[s,v]; truoc[v]=s; } d[s]=0; T = V\{s};(*T là t p đnh có nhãn t m th i*) while (T!=φ ) { (* b c l p *)

Tìm đnh u∈T sao cho d[u] = min { d[z] : z∈T} T= T\{u}; (*c đnh nhãn đnh u*);

For (v∈T) { (* Gán l i nhãn cho các đnh trong T*) If ( d[v] > d[u] + A[u, v] ) { d[v] = d[u] + A[u, v]; truoc[v] =u; } } } }

5.7.3. Thu t toán Floy

tìm đ ng đi ng n nh t gi a t t c các c p đnh c a đ th , chúng ta có th s d ng n l n thu t toán Ford_Bellman ho c Dijkstra (trong tr ng h p tr ng s không âm). Tuy nhiên, trong c hai thu t toán đ c s d ng đ u có đ ph c t p tính toán l n (chí ít là O(n3)). Trong tr ng h p t ng quát, ng i ta th ng dùng thu t toán Floyđ c mô t nh sau:

void Floy(){

Input: th cho b i ma tr n tr ng s a[i, j], i, j = 1, 2, . . ., n.

Output:- Ma tr n đ ng đi ng n nh t gi a các c p đnh d[i, j], i, j = 1, 2, . . .,n; d[i,j] là đ dài ng n nh t t i đ n j.

Ma tr n ghi nh n đ ng đi p[i, j], i, j = 1, 2, . . ., n

p[i, j] ghi nh n đnh đi tr c đnh j trong đ ng đi ng n nh t;*) (*b c kh i t o*)

for( i=1; i≤; i++) for( j =1; j≤n; j++) { d[i,j] = a[i, j]; p[i,j] = i; } (*b c l p *) for (k=1; k≤n; k++)

for( i=1; i≤n; i++)

for (j =1; j≤n; j++) if (d[i,j] > d[i, k] + d[k, j]) { d[i, j] = d[i, k] + d[k, j]; p[i,j] = p[k, j]; } }

B n đ c có th tìm th y nh ng cài đ t c th các thu t toán trên đ th thông qua các tài li u [1], [5].

NH NG N I DUNG C N GHI NH

X N m v ng nh ng khái ni m và đnh ngh a c b n c a đ th . X Hi u đ c các ph ng pháp bi u di n đ th trên máy tính.

X N m v ng đ c các thu t toán tìm ki m trên đ th : thu t toán tìm ki m theo chi u r ng, thu t toán tìm ki m theo chi u sâu và ng d ng c a nó trong bài toán tìm đ ng đi gi a hai đnh c a đ th c ng nh trong tính toán các thành ph n liên thông c a đ th .

X N m v ng s khác bi t gi a đ th Euler và đ th Hamilton cùng v i thu t toán tìm đ ng đi và chu trình trên các đ th Euler & Hamilton.

X N m v ng bài toán tìm cây bao trùm & tìm cây bao trùm nh nh t.

X Hi u & cài đ t nhu n nhuy n các thu t toán tìm đ ng đi ng n nh t gi a các c p đnh c a đ th tr ng s .

BÀI T P CH NG 5

Bài 1. Cho tr c ma tr n k c a đ th . Hãy vi t ch ng trình t o ra danh sách k c a đ th đó.

Bài 2. Cho tr c danh sách k c a đ th , hãy t o nên ma tr n k c a đ th .

Bài 3. M t bàn c 8×8 đ c đánh s theo cách sau:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

M i ô có th coi là m t đnh c a đ th . Hai đnh đ c coi là k nhau n u m t con vua đ t ô này có th nh y sang ô kia sau m t b c đi. Ví d : ô 1 k v i ô 2, 9, 10, ô 11 k v i 2, 3, 4, 10, 12, 18, 19, 20. Hãy vi t ch ng trình t o ma tr n k c a đ th , k t qu in ra file king.out.

Bài 4. Bàn c 8×8 đ c đánh s nh bài trên. M i ô có th coi là m t đnh c a đ th . Hai đnh đ c g i là k nhau n u m t con mã đ t ô này có th nh y sang ô kia sau m t n c đi. Ví d ô 1 k v i 11, 18, ô 11 k v i 1, 5, 17, 21, 26, 28. Hãy vi t ch ng trình l p ma tr n k c a đ th , k t qu ghi vào file ma.out.

Bài 5. Hãy l p ch ng trình tìm m t đ ng đi c a con mã trên bàn c t ô s đ n ô t (s, t đ c nh p t bàn phím).

Bài 6. Cho C s d li u ghi l i thông tin v N Tuy n bay (N<=100) c a m t hãng hàng không. Trong đó, thông tin v m i tuy n bay đ c mô t b i: i m kh i hành (departure), đi m đ n (destination), kho ng cách (lenght). Departure, destination là m t xâu kí t đ dài không quá 32, không ch a d u tr ng gi a, Length là m t s nh h n 32767.

Ta g i “Hành trình bay” t đi m kh i hành A t i đi m đ n B là dãy các hành trình [A, A1, n1], [A1, A2, n2] . . .[Ak, B,nk] v i Ai là đi m đ n c a tuy n i nh ng l i là đi m kh i

hành c a tuy n i +1, ni là kho ng cách c a tuy n bay th i (1<=i<k). Trong đó, kho ng cách c a hành trình là t ng kho ng cách c a các tuy n mà hành trình đi qua (n1+n2+. .+nk).

Cho file d li u ki u text hanhtrinh.in đ c ghi theo t ng dòng, s các dòng trong file d li u không v t quá N, trên m i dòng ghi l i thông tin v m t tuy n bay, trong đó departure, destination, length đ c phân bi t v i nhau b i m t ho c vài d u tr ng. Hãy tìm gi i pháp đ tho mãn nhu c u c a khách hàng đi t A đ n B theo m t s tình hu ng sau:

Tìm hành trình có kho ng cách bé nh t t A đ n B. In ra màn hình t ng đi m mà hành trình đã qua và kho ng cách c a hành trình. N u hành trình không t n t i hãy đ a ra thông báo “Hành trình không t n t i”.

Ví d v C s d li u hanhtrinh.in New_York Chicago 1000 Chicago Denver 1000 New_York Toronto 800 New_York Denver 1900 Toronto Calgary 1500 Toronto Los_Angeles 1800 Toronto Chicago 500 Denver Urbana 1000 Denver Houston 1500 Houston Los_Angeles 1500 Denver Los_Angeles 1000

V i đi m đi : New_York, đi m đ n : Los_Angeles ; chúng ta s có k t qu sau: Hành trình ng n nh t:

New_York to Toronto to Los_Angeles; Kho ng cách: 2600.

Bài 7. K t c thành công v i kh i l p ph ng th n bí, Rubik sáng t o ra d ng ph ng c a trò ch i này g i là trò ch i các ô vuông th n bí. ó là m t b ng g m 8 ô vuông b ng nhau nh hình 1. Chúng ta qui đnh trên m i ô vuông có m t màu khác nhau. Các màu đ c kí hi u b i 8 s nguyên t ng ng v i tám màu c b n c a màn hình EGA, VGA nh hình 1. Tr ng thái c a b ng các màu đ c cho b i dãy kí hi u màu các ô đ c vi t l n l t theo chi u kim đ ng h b t đ u t ô góc trên bên trái và k t thúc ô góc d i bên trái. Ví d : tr ng thái trong hình 1 đ c cho b i dãy các màu t ng ng v i dãy s (1, 2, 3, 4, 5 , 6, 7, 8). Tr ng thái này đ c g i là tr ng thái kh i đ u.

Bi t r ng ch c n s d ng 3 phép bi n đ i c b n có tên là ‘A’, ‘B’, ‘C’ d i đây bao gi c ng chuy n đ c t tr ng thái kh i đ u v tr ng thái b t k :

‘A’ : đ i ch dòng trên xu ng dòng d i. Ví d sau phép bi n đ i A, hình 1 s tr thành hình 2:

‘B’ : th c hi n m t phép hoán v vòng quanh t trái sang ph i trên t ng dòng. Ví d sau phép bi n đ i B hình 1 s tr thành hình 3:

‘C’ : quay theo chi u kim đ ng h b n ô gi a. Ví d sau phép bi n đ i C hình 1 tr thành hình 4:

Hình 1 Hình 2 Hình 3 Hình 4

Cho file d li u Input.txt ghi l i 8 s nguyên trên m t dòng, m i s đ c phân bi t v i nhau b i m t d u tr ng ghi l i tr ng thái đích. Hãy tìm dãy các phép bi n đ i s b n đ đ a tr ng thái kh i đ u v tr ng thái đích sao cho s các phép bi n đ i là ít nh t có th đ c.

D li u ra đ c ghi l i trong file Output.txt, dòng đ u tiên ghi l i s các phép bi n đ i, nh ng dòng ti p theo ghi l i tên c a các thao tác c b n đã th c hi n, m i thao tác c b n đ c vi t trên m t dòng.

B n s đ c thêm 20 đi m n u s d ng b ng màu thích h p c a màn hình đ mô t l i các phép bi n đ i tr ng thái c a trò ch i. Ví d v i tr ng thái đích d i đây s cho ta k t qu nh sau: Input.txt Output.txt 2 6 8 4 5 7 3 1 7 B C A B C C B

Bài 8. Cho m t m ng thông tin g m N nút. Trong đó, đ ng truy n tin hai chi u tr c ti p t nút i đ n nút j có chi phí truy n thông t ng ng là m t s nguyên A[i,j] = A[j,i], v i A[i,j]>=0, i ≠ j. N u đ ng truy n tin t nút i1đ n nút ik ph i thông qua các nút i2, . . ik-1 thì chi phí truy n thông đ c tính b ng t ng các chi phí truy n thông A[i1,i2], A[i2,i3], . . . A[ik-1,ik]. Cho tr c hai nút i và j. Hãy tìm m t đ ng truy n tin t nút i đ n nút j sao cho chi phí truy n thông là th p nh t.

1 2 3 4 8 7 6 5 8 7 6 5 1 2 3 4 4 1 2 3 5 8 7 6 1 7 2 4 8 6 3 5

D li u vào đ c cho b i file TEXT có tên INP.NN. Trong đó, dòng th nh t ghi ba s N, i, j, dòng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.

K t qu thông báo ra file TEXT có tên OUT.NN. Trong đó, dòng th nh t ghi chi phí truy n thông th p nh t t nút i đ n nút j, dòng th 2 ghi l n l t các nút trên đ ng truy n tin có chi phí truy n thông th p nh t t nút i t i nút j.

Bài 9. Cho m t m ng thông tin g m N nút. Trong đó, đ ng truy n tin hai chi u tr c ti p t nút i đ n nút j có chi phí truy n thông t ng ng là m t s nguyên A[i,j] = A[j,i], v i A[i,j]>=0, i ≠ j. N u đ ng truy n tin t nút i1đ n nút ik ph i thông qua các nút i2, . . ik-1 thì chi phí truy n thông đ c tính b ng t ng các chi phí truy n thông A[i1,i2], A[i2,i3], . . . A[ik-1,ik]. Bi t r ng, gi a hai nút b t k c a m ng thông tin đ u t n t i ít nh t m t đ ng truy n tin.

ti t ki m đ ng truy n, ng i ta tìm cách lo i b đi m t s đ ng truy n tin mà v n đ m b o đ c tính liên thông c a m ng. Hãy tìm m t ph ng án lo i b đi nh ng đ ng truy n tin, sao cho ta nh n đ c m t m ng liên thông có chi phí t i thi u nh t có th đ c.

D li u vào đ c cho b i file TEXT có tên INP.NN. Trong đó, dòng th nh t ghi s N, dòng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.

K t qu thông báo ra file TEXT có tên OUT.NN trong đó dòng th nh t ghi chi phí truy n thông nh nh t trong toàn m ng. T dòng th 2 ghi l n l t các nút trên đ ng truy n tin, m i đ ng truy n ghi trên m t dòng.

Bài 10.Cho file d li u đ c t ch c gi ng nh bài 6.6. Hãy tìm t t c các hành trình đi t đi m s đ n t.

Bài 11.Cho file d li u đ c t ch c gi ng nh bài 6.6. Hãy tìm hành trình đi t đi m s đ n t sao cho hành trình đi qua nhi u node nh t.

Bài 12.Cho file d li u đ c t ch c gi ng nh bài 6.6. Hãy tìm hành trình đi t đi m s đ n t sao cho hành trình đi qua ít node nh t.

Bài 13.Tìm hi u thu t toán leo đ i trên đ th và ng d ng c a nó trong l nh v c trí tu nhân t o.

CH姶愛NG 6: SP XP VÀ TÌM KIM (SORTING AND SEARCHING)

S p x p & tìm ki m là bài toán c b n nh t c a tin h c. Có th nói, m i t ng tác gi a con ng i và h th ng máy tính v b n ch t đ u là tìm ki m và thu th p thông tin. n sau các quá trình tìm ki m là vi c s p x p các đ i t ng theo m t tr t t nào đó đ quá trình tìm ki m di n ra nhanh nh t, chính xác và hi u qu nh t đó là ý ngh a c b n c a quá trình

Một phần của tài liệu cơ sở kỷ thuật lập trình (Trang 123)

Tải bản đầy đủ (PDF)

(156 trang)