Thuat toan floyd tìm đường đi ngắn nhất giữa mọi cặp đỉnh trên đồ thị vô hướng

8 743 0
Thuat toan floyd tìm đường đi ngắn nhất giữa mọi cặp đỉnh trên đồ thị vô hướng

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

Thông tin tài liệu

FloydWarshall Algorithm (viết tắt là FW Algo.) là tìm đường đi ngắn nhất giữa mọi cặp đỉnh trên đồ thị vô hướng không có chu kỳ âm dựa trên khái niệm “các đỉnh trung gian”. Ý tưởng chính của FW Algo. là: Cho V={1, 2,…, n} là tập đỉnh của đồ thị và tập đỉnh U={1, 2,…, k}. Xét cặp đỉnh i,j và mọi đường đi có thể từ i đến j với các đỉnh trung gian chỉ là các đỉnh thuộc tập U. Gọi p là đường đi ngắn nhất từ i đến j với các đỉnh trung gian thuộc U. Khi đó ta có hai tình huống sau: a. Nếu k không là đỉnh trung gian trên đường đi từ i đến j thì đường đi ngắn nhất từ i đến j có các đỉnh trung gian là {1, 2,…, k1} cũng là đường đi ngắn nhất từ i đến j với các đỉnh trung gian là {1, 2,…, k} b. Nếu k là một đỉnh trung gian trên đường đi từ i đến j thì ta tách đường đi p thành hai đoạn con là p1 đi từ i đến k và p2 đi từ k đến j. Các đoạn đường con p1, p2 là các đường đi ngắn nhất với các đỉnh trung gian là các đỉnh {1, 2,…, k1}.

1 Mục đích Floyd-Warshall Algorithm (viết tắt F-W Algo.) tìm đường ngắn cặp đỉnh đồ thị vô hướng chu kỳ âm dựa khái niệm “các đỉnh trung gian” Khái niệm trung tâm F-W Algo “các đỉnh trung gian”.” Định nghĩa: Ký hiệu p=(x1, x2,…, xk)là đường từ x1 đến xk đỉnh x2,…,xk gọi đỉnh trung gian đường p từ x1 đến xk Ý tưởng F-W Algo là: Cho V={1, 2,…, n} tập đỉnh đồ thị tập đỉnh U={1, 2,…, k} Xét cặp đỉnh i,j đường từ i đến j với đỉnh trung gian đỉnh thuộc tập U Gọi p đường ngắn từ i đến j với đỉnh trung gian thuộc U Khi ta có hai tình sau: a Nếu k không đỉnh trung gian đường từ i đến j đường ngắn từ i đến j có đỉnh trung gian {1, 2,…, k-1} đường ngắn từ i đến j với đỉnh trung gian {1, 2, …, k} b Nếu k đỉnh trung gian đường từ i đến j ta tách đường p thành hai đoạn p1 từ i đến k p2 từ k đến j Các đoạn đường p1, p2 đường ngắn với đỉnh trung gian đỉnh hệ thức sau: {1, 2,…, k-1} Từ suy cách xác định độ dài đường từ i đến j nhờ c Trong dij độ dài đường ngắn từ i đến j; wij trọng số đường ij Từ hệ thức ta thấy: để xác định độ dài đường ngắn dij{1 k} từ i đến j qua đỉnh tập {1, 2,…, k} ta cần dựa vào dij{1 k-1} (đường ngắn từ i đến j qua tập đỉnh 1… k-1).∈ Đến ta có thủ tục mô tả ý tưởng F-W Algo: Procedure F_W; {Đoạn chương trình khởi trị cho biến} Begin For i:=1 to n For j:=1 to n d[i,j]:=w[i,j]; trọng sô w[i,j] } đến j} End; {Trị ban đầu biến lưu đường ngắn p[i,j]:=i; {Ghi nhớ đỉnh i đứng trước j có đưưòng ngắn {Đoạn chương trình mô tả F-W Algo.} Begin For k:=1 to n For i:=1 to n For j:=1 to n If di,j]>d[i,k]+d[j,k] Then Begin d[i,j:=d[i,k]+d[j,k]; từ i đếnj} p[i,j]>p[k,j]; {k đỉnh trung gian đường ngắn End; End; Cài đặt trực quan (trên ngôn ngữ Pascal) cho F-W Algo (Cài đặt dùng nhiều năm liền sinh viên CNTT số trường công, tư lập từ Hà nội đến Đồng Hới thực hành thành công thuật toán F-W) PROGRAM FLOYD_WARSHALL; USES CRT,GRAPH; CONST R=15;DL=500;N=5;VC=200;VOCUC=10000; C:ARRAY[1 5] OF INTEGER=(240,460,350,130,20); D:ARRAY[1 5] OF INTEGER=(20,240,460,460,240); EC:ARRAY[1 10] OF INTEGER=(350,276,204,130,405,295,240,240,185,75); ED:ARRAY[1 10] OF INTEGER=(130,166,166,130,360,360,240,460,360,360); VAR G,A,P:ARRAY[1 N,1 N] OF INTEGER; DAU,CUOI:INTEGER; (* -*) PROCEDURE INITGR; {KHOI TAO DO HOA} VAR GD,GM:INTEGER; BEGIN GD:=DETECT; INITGRAPH(GD,GM,' BGI'); IF (GRAPHRESULT GROK) THEN BEGIN WRITELN('LOI KHOI TAO DO HOA, GO ENTER KET THUC !'); READLN; HALT(1) END END; (* -*) PROCEDURE VENUT(U,M1,M2:INTEGER); {Ve cac dinh thi} VAR ST:STRING[3]; BEGIN SETFILLSTYLE(1,M2); SETCOLOR(M1); FILLELLIPSE(C[U],D[U],R,R); STR(U,ST); OUTTEXTXY(C[U]-2,D[U]-2,ST); END; (* -*) PROCEDURE LINK(X,Y,M1,M2:INTEGER); VAR T:INTEGER;ST:STRING[3]; BEGIN SETCOLOR(M2); LINE(C[X],D[X],C[Y],D[Y]); T:=Y-X+((X-1)*(2*N-X)) DIV 2; STR(G[X,Y],ST); SETCOLOR(M1); OUTTEXTXY(EC[T],ED[T],ST); END; (* -*) {Noi cac dinh} PROCEDURE INIT_GRAPH; {Tu dong tao cau truc thi mot cach ngau nhien} VAR I,J:INTEGER; BEGIN RANDOMIZE; FOR I:=1 TO N DO BEGIN G[I,I]:=0; FOR J:=I+1 TO N DO BEGIN IF RANDOM(2)=1 THEN G[I,J]:=10+RANDOM(VC-10) ELSE G[I,J]:=VOCUC; G[J,I]:=G[I,J] END; END; FOR I:=1 TO N DO BEGIN J:=0; REPEAT J:=J+1 UNTIL ((G[I,J]>0) AND (G[I,J] IF (J=N) AND ((G[I,N]=0) OR (G[I,N]=VOCUC)) THEN BEGIN J:=1+RANDOM(N); IF J=I THEN IF I G[I,J]:=10+RANDOM(VC-10);G[J,I]:=G[I,J] END; END; END; (* *) PROCEDURE DEMO; {Ghi cac thao tac man:} VAR K:CHAR;I:INTEGER; BEGIN SETFILLSTYLE(1,BLUE); BAR(480,0,GETMAXX,GETMAXY); SETCOLOR(YELLOW); OUTTEXTXY(500,30,'Nhap Hai Dinh:'); OUTTEXTXY(500,60,'Dinh Dau, Cuoi'); SETCOLOR(WHITE); OUTTEXTXY(500,105,'Dau='); REPEAT K:=READKEY;VAL(K,DAU,I) UNTIL I=0; OUTTEXTXY(540,105,K); OUTTEXTXY(500,150,'Cuoi='); REPEAT K:=READKEY;VAL(K,CUOI,I) UNTIL I=0; OUTTEXTXY(548,150,K); OUTTEXTXY(490,270,'Go Space Tim Tiep '); SETCOLOR(YELLOW); OUTTEXTXY(490,320,'Go Enter Tao Moi '); SETCOLOR(RED); OUTTEXTXY(490,370,'Go Esc Ket Thuc !'); END; (* *) PROCEDURE PRINT_GRAPH; {In thi} VAR I,J:INTEGER; BEGIN SETBKCOLOR(BLUE);CLEARDEVICE; SETFILLSTYLE(1,DARKGRAY); BAR(0,0,GETMAXY,GETMAXY); FOR I:=1 TO N DO BEGIN FOR J:=I+1 TO N DO IF (G[I,J]>0) AND (G[I,J] VENUT(I,YELLOW,BLUE); END; END; (* -*) PROCEDURE FLOYLD_WARSHALL; {Thuat toan Floyld_Warshall} VAR I,J,K:INTEGER; BEGIN FOR I:=1 TO N DO FOR J:=1 TO N DO BEGIN A[I,J]:=G[I,J]; P[I,J]:=0; END; FOR K:=1 TO N DO FOR I:=1 TO N DO FOR J:=1 TO N DO IF A[I,K]+A[K,J] BEGIN A[I,J]:=A[I,K]+A[K,J]; {Day la duong di min} P[I,J]:=K; {Ghi nho dinh k vao mang P} END; END; (* *) PROCEDURE SEARCHD(D1,D2:INTEGER); VAR ST:STRING[20]; BEGIN IF P[D1,D2]=0 THEN BEGIN VENUT(D1,BLUE,YELLOW);DELAY(DL); VENUT(D2,BLUE,YELLOW);DELAY(DL); END ELSE BEGIN SEARCHD(D1,P[D1,D2]); SEARCHD(P[D1,D2],D2); END; END; (* -*) PROCEDURE SEARCH; VAR ST:STRING[20]; BEGIN IF A[DAU,CUOI]=VOCUC THEN ST:='Khong Co Duong Di !' ELSE BEGIN STR(A[DAU,CUOI],ST); ST:='Min = '+ST; SEARCHD(DAU,CUOI); END; SETCOLOR(RED); OUTTEXTXY(490,210,ST); END; (* -*) PROCEDURE TRAVERSE; VAR K:CHAR; BEGIN IF KEYPRESSED THEN REPEAT K:=READKEY UNTIL NOT KEYPRESSED; REPEAT INIT_GRAPH; FLOYLD_WARSHALL; REPEAT PRINT_GRAPH; DEMO; SEARCH; K:=READKEY; UNTIL (K=#27) OR (K=#13); UNTIL (K=#27); END; (* *) BEGIN (* CHUONG TRINH CHINH *) CLRSCR; INITGR; TRAVERSE; CLOSEGRAPH; END

Ngày đăng: 12/08/2016, 21:16

Từ khóa liên quan

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

Tài liệu liên quan