420 likes | 575 Views
Thuật toán trên đồ thị. Một số khái niệm. Đồ thị: G = {V, E}, trong đó V = n, n>0, và E VV, V – tập đỉnh, E – tập cạnh và E = m, m 0 . Nếu (a,b) E mà suy ra (b,a) E và (b,a) = (a,b) thì G – vô hướng. Ngược lại, G – có hướng. Nếu e=(a,b) E thì a gọi là liền k ề với b
E N D
Một số khái niệm Đồ thị: G = {V, E}, trong đó V= n, n>0, và E VV, V – tập đỉnh, E– tập cạnh và E= m, m0. Nếu (a,b)E mà suy ra (b,a) E và (b,a) = (a,b) thì G – vô hướng. Ngược lại, G – có hướng. Nếu e=(a,b)E thì a gọi là liền kề với b và e liên thuộc với a và b. Ký hiệu V= { u1, u2, ..., un} Dao Thanh Tinh
Một số khái niệm (2) Cho đồ thị: G = {V, E}, Dãy (uo,uk) = <uo, u1, ..., um>, với (ui,ui+1) E, i = 0,...,k-1 và ui V, i = 0,...,k được gọi là đường đi từ uo tới uk. Số cạnh có trên (uo,uk) được gọi là độ dài của đường đi (trong định nghĩa trên là m). Dao Thanh Tinh
Một số khái niệm (3) Đồ thị: G = {V, E}, Cho ánh xạ f: E R+, với eE, f(e) – trọng số cạnh e. Đồ thị G = {V,E,f} gọi là có trọng số Xét đường đi (uo,uk) = <uo, u1, ..., um>, Đại lượng ((uo,uk)) = f(ui,ui+1)i = 0,...,k-1 được gọi là độ dài đường đi từ uo tới uk. Dao Thanh Tinh
Một số khái niệm (4) Đồ thị: G = {V, E}, Đường kính của đồ thị là độ dài lớn nhất đường đi giữa các cặp đỉnh. Đồ thị G gọi là liên thông nếu giữa hai đỉnh bất kỳ có đường đi. Đường đi (uo,uk) = <uo, u1, ..., um> gọi là kín nếu uo=uk. Dao Thanh Tinh
Một số khái niệm (5) Đồ thị: G = {V, E}, Đường đi (uo,uk) = <uo, u1, ..., um> gọi là đơn nếu mỗi cạnh có mặt trên đường đi không quá 1 lần. Đường đi kín và đơn gọi là chu trình. Dao Thanh Tinh
Một số khái niệm (6) Đồ thị G = {V, E} liên thông, không có chu trình gọi là cây. Trong cây T = {V,E} nếu có một đỉnh đặc biệt được gọi là gốc thì cây được gọi là có thứ tự. Dao Thanh Tinh
Duyệt đồ thị Đồ thị G = {V, E} liên thông Depth-First Search for all xV visited(x):= false; i:=0; DFS(v); output p[1..n]; Procedure DFS (v: đỉnh) • visited(v):= true; • i:=i+1; p[i] := v; • for each w liền kề của v If (visited(w)= false); DFS(w); Thời gian tính toán O(|V|+|E|) Dao Thanh Tinh
Duyệt đồ thị (2) Đồ thị G = {V, E} liên thông Breadth-First Search MakeNil(Q); for all xV visited(x):= false; i:=1; visited(v):= true; p[i] := v; enqueue(v,Q); while (QNIL) a) u:=front(Q);dequeue(Q); b) for each x liền kề của v If (visited(x)= false); enqueue(x,Q); visited(x):=true; inc(i); p[i]=x; output p[1..n]; Thời gian tính toán O(|V|+|E|) Dao Thanh Tinh
Single-Source Shortest Paths Cho G={V,E} liên thông, f: ER+ và u, v V. Ký hiệu (u,v) = {(u,v)} Tìm *(u,v) (*(u,v)) = min {((u,v)) : (u,v) (u,v)} The Implementation of Dijkstra’s Algorithm Với xV ký hiệu L(x) – độ dài đường đi ngắn nhất *(u,x); Giá trị khởi tạo L(u) = 0; L(x) = + với xV\{u} Ký hiệu tập S: nếu xS thì L(x) = (*(u,x)) V+(x) = {y V : (x,y) E} V-(x) = {y V : (y,x) E} Dao Thanh Tinh
Single-Source Shortest Paths(2) The Implementation of Dijkstra’s Algorithm L(u) = 0; for all xV\{u} do L(x) = + while (S(v) = false) • L(a) = min {L(x): xV \ S; S(a)=true; • for all x (V\S) V+(a) if L(a)+ f(a,x)<L(x) then L(x):=L(a)+f(a,x); k := 0; pk := v; while (pku) • Tìm y V-(pk) sao cho L(y) + f(y,pk) = L(pk) • pk+1 = x; • k++; Output p[k..0], L(v); Running time O(|V||E|) Dao Thanh Tinh
Single-Source Shortest Paths(3) Dao Thanh Tinh
Single-Source Shortest Paths(4) Chứng minh thuật toán • t S, L(t) = (*(u,t)). Khi k = 0 có 1 đỉnh t = u ! • L(a) = min {L(t): t V\S} L(a)= (*(u,a)) và *(u,a) chỉ chứa các đỉnh (không kể a) thuộc S.Giả thiết đúng khi k=0. Giả sử Lk(a) > (*(u,a)). Đặt = L(a). Kí hiệu t là đỉnh ngay trước a trên *(u,a): L(t) + f(t,a)= (*(u,a)) hay Lk(t) < (*(u,a)) < Lk(a) Nếu tS thì do L(t) + f(t,a)= (*(u,a)) < . Đặt L(a)=L(t)+f(t,a)< . Nghĩa là giảm được L(a). Vô lý! Nếu t S,theo thuật toánLk(a) < Lk(t) < = L(a). Mâu thuẫn. Nghĩa là (*(u,a)) = Lk(a) Dao Thanh Tinh+
Single-Source Shortest Paths(5) Floyd Shortest-Path Kí hiệu V={1, 2, ..., n} for x=1 to n for y=1 to n if ((x,y) E) D(x,y) = f(x,y) else D(x,y) = + for k=1 to n for x=1 to n for y=1 to n D(x,y) = min{D(x,y), D(x,k)+D(k,y)} Xác định đường đi: tương tự Dijsktra Running time O(|V|3) Dao Thanh Tinh
Single-Source Shortest Paths (6) Cho G={V,E} liên thông, không trọng số (f:E{1}) và u, v V. Ký hiệu (u,v) = {(u,v)}. Độ dài đường đi tính bằng số cạnh tham gia. Tìm *(u,v) (*(u,v)) = min {((u,v)) : (u,v) (u,v)} Với xV ký hiệu L(x) – độ dài đường đi ngắn nhất *(u,x); Giá trị khởi tạo L(u) = 0; L(x) = + với xV\{u} Ký hiệu tập Am = { xV: L(x) = m} V+(x) = {y V : (x,y) E} V-(x) = {y V : (y,x) E} Dao Thanh Tinh
Single-Source Shortest Paths(7) The Implementation of Algorithm m=0; L(u) = m; Am={u}; for all xV\{u} do L(x) = + while (L(v) = +) • Am+1 ={ }; • for all x Am for all y V+(x) if (L(y) = +) then L(y):= m+1; Am+1 = Am+1 {y}; pm := v; po := u; for k:= m-1 downto 1 • Tìm y V-(pk+1) Ak; • pk = y; Output p[0..m], L(v)=m; Running time O(|V||E|) Dao Thanh Tinh
Minimum Spanning Tree Cho G={V,E}. T={V,E*}, E* E, liên thông, không có chu trình gọi là cây khung của G Remark: • Đồ thị vô hướng là cây u,v V, (u,v) là đường đi đơn • Đồ thị G có cây khung G liên thông Kí hiệu (G) là tập các cây khung của G. Bài toán 1. Cho G liên thông. Tìm T(G). Bài toán 2. Cho G có trọng số và T(G). Kí hiệu (T) là tổng trọng số các cạnh thuộc T. Tìm T*(G) sao cho (T*) = min {(T) : T(G)} T* - minimum spanning tree của G. Dao Thanh Tinh
Minimum Spanning Tree (2) Bài toán 1. Cho G liên thông. Tìm T(G). void DFS(u: đỉnh); checked[u] = true; for each x V(u) if checked(x)=false {T:= T(u,x); DFS (x);} void BFS( a: đỉnh); enqueue (a, Q); checked[ a] = true; while ! empty(Q) u = front(Q); dequeue(Q); for each x V(u) if checked(x) = false { T:=T (u, x); enqueue(x Q); checked(x)=true; } for all x V checked(x) = false; DFS(v); for all x V checked(x) = false; mkenull(Q); BFS(v); O(|V||E|) 2014-08-31 Dao Thanh Tinh 18
Minimum Spanning Tree (3) Bài toán 2. Cho G có trọng số và T(G). Kí hiệu (T) là tổng trọng số các cạnh thuộc T. Tìm T*(G) sao cho (T*) = min {(T) : T(G)} T* - minimum spanning tree của G. • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); O(m+nlgn) 2014-08-31 Dao Thanh Tinh 19
Minimum Spanning Tree (4) • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T)<n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); 2014-08-31 Dao Thanh Tinh 20
Minimum Spanning Tree (5) • Thuật toán PRIME • 1. T:= { e E, f(e) - min}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a) liên thuộc với một đỉnh của T; • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); Xét cấu trúc: V={1, 2, ...,n} E= g(1..m) of record d, c : tên đỉnh; t : trọng số; end; Sử dụng S: đánh dấu đỉnh thuộc T • 1) sort g(1).t...g(m).t; • 2) for x=1 to n do S(x)=0; • 3) k:=1; T(k) := g(1); S(T(k).d) :=1; S(T(k).c) :=1; • 4) := T(1).t; • 5) while (k<n-1) • a) j=2; while (S(g(j).d)=S(g(j).c)) j:= j +1; • c) k:= k+1; T(k):=g(j); • := + T(k).t; • S(T(k).d):= 1; S(T(k).c):= 1; • 6) output T(1)..T(n-1), ; Time of Algorithm is O(nm) 2014-08-31 Dao Thanh Tinh 21
Minimum Spanning Tree (6) • Thuật toán KRUSKAL • 1. T:= {}; • 2. While Số cạnh(T) < n-1 do • Chọn e là cạnh • a); • b) T{ e} không có chu trình; • c) có trọng số nhỏ nhất. • T := T { e}; • 3. Output T, (T); Xét cấu trúc: V={1, 2, ...,n} E= g(1..m) of record d, c : tên đỉnh; t : trọng số; end; Sử dụng S: đánh dấu cây con • 1) sort g(1).t...g(m).t; • 2) for x=1 to n do S(x)=x; k=0; =0; j=1; • 3) while (k<n-1) • a)while (S(g(j).d)=S(g(j).c)) j= j+1; • c) k:= k+1; T(k):=g(j); • = + T(k).t; • p=S(T(k).d); h=S(T(k).c); • for x:=1 to n do if (S(x)=h) S(x)=p; • 4) output T(1)..T(n-1), ; Time of Algorithm is O(nm) 2014-08-31 Dao Thanh Tinh 22
Minimum Spanning Tree (7) • Thuật toán PRIM (1) • 1. for all i V L(i):=∞; • 2. p(v) := null; L(v) := 0; • 3. H = V; • 4. while (H null) • L(a)=min{ L(x): xH}; H=H\{a}; • for all xV(a)H • if L(x) > f(a, x) then • {L(x) = f(a, x); p(x) := a;} • 5. output {(x,p(x)), xV, p(x)null;} Time of Algorithm is O(n2) = 9+8+7+6+4 = 34 2014-08-31 Dao Thanh Tinh 23
Minimum Spanning Tree (8) • Thuật toán PRIM • 1. for all i V L(i):=∞; • 2. p(v) := null; L(v) := 0; • 3. H = V; • 4. while (H null) • L(a)=min{ L(x): xH}; H=H\{a}; • for all xV(a)H • if L(x) > f(a, x) then • {L(x) = f(a, x); p(x) := a;} • 5. output {(x,p(x)), xV, p(x)null;} (a,b) (c,b) (d,f) (e,d) (f,c) = 8+9+7+6+4 = 34 2014-08-31 Dao Thanh Tinh 24
The Network Flow Problem T = {G,f} - mạng vận tải G={V,E} có hướng ! a, z : V(a)=, V+(z)= , a- cửa vào và z-cửa ra e: f(e)- khả năng của mạng tại e Luồng trên mạng T : E Ro e E, 0(e)f(e) v V\{a,z} thoả mãn: Từ (1) Q(a) = Q(z). Ký hiệu = Q(a) - giá trị của luồng 2014-08-31 Dao Thanh Tinh 25
The Network Flow Problem (2) Bài toán: Cho T = {G,f} Tìm sao cho đạt giá trị lớn nhất 2014-08-31 Dao Thanh Tinh 26
The Network Flow Problem (3) • Thuật toán: • Ý tưởng: • Chọn luồng khởi tạo; • Tìm các đường tăng được (dãy các đỉnh từ cửa vào đến cửa ra mà ta có thể thêm hoặc bớt hàm trên mỗi cung của dãy này cùng một giá trị nào đó mà vẫn đảm bảo là luồng đồng thời làm tăng giá trị của luồng). Ví dụ, dãy • { (x0x1) (x1x4)(x4 x3) (x3z) } • là đường tăng được. Thêm vào các cung trên dãy này một giá trị là 2. Hàm ’ nhận được vẫn là luồng. • 3. Lặp lại bước 2 cho đến khi không còn đường tăng được 2014-08-31 Dao Thanh Tinh 27
The Network Flow Problem (4) • Thuật toán: • for each e E do (e) := 0; • := 0; • repeat • xoá nhãn, dấu • gán nhãn, dấu và tính giá trị tăng được *; • if chưa cực đại • thực hiện tăng luồng ; • := + *; • until -cực đại; 2014-08-31 Dao Thanh Tinh 28
The Network Flow Problem (5) • Gán nhãn, xác định giá trị tăng được *: • Gán chỉ số cho các đỉnh, u0 = a; • Gán dấu cho cung e thích hợp: • Nếu e=(uk,x), (e)<f(e) thì M(e)=‘+’, • Nếu e=(x,uk),(e)>0 thì M(e)= ‘‘. • 2) Nhãn của đỉnh x: L(x)={c(x), (x)} • c(x)=k, chỉ số của ukvà • giá trị lớn nhất mà luồng có thể tăng • được kể từ cửa vào cho đến nút x. • Nếu dấu e = (uk,x) là ‘+’ thì có thể tăng , ngược lại, nếu dấu e=(x,uk) là ‘-‘có thể giảm . Ví dụ, e=(x1,x4) có thể gán dấu + L(x4) = {1, 6} nếu xét dãy các đỉnh từ x0, x1, x4. 2014-08-31 Dao Thanh Tinh 29
The Network Flow Problem (6) f =7 =1 f =8 f =2 f =7 =1 =1 =0 f =10 f =3 =0 =0 f =10 =0 f =15 f =3 =1 =1 u1 u4 z uo u2 u3 1) (u0) := +; R := {u0}; 2) while (R ) & (L(z)= { }) a) chọn uk R; R := R\{uk}; b) for each x V+(uk) or x V(uk) if L(x) = { } if (xV+(uk)) & ((uk,x)<f(uk,x)) c(x) = k; M(uk, x) = ‘+’; (x) = min{(uk), f(uk,x) - (uk,x)}; if (x,uk)>0 c(x) = k; M(x,uk) = ‘’; (x) = min { (uk), (x,uk) }; if (L(x){ }) R := R {x} 3) if L(z) ={ } MAX() = TRUE else MAX() = FALSE; 4) * := (z); { 0 ,7} {1,6} + + + {4,1} { 0,10} { ,} + + { 0,2} *=1 R={ u1 , u2 , u3 R={u4, u2, u3 R={ uo R={u2, u3 R={u2, u3 2014-08-31 Dao Thanh Tinh 30
The Network Flow Problem (7) f =7 =1 f =8 f =2 f =7 =1 =1 =0 f =10 f =3 =0 =0 f =10 =0 f =15 f =3 =1 =1 u1 u4 z uo u2 u3 x := z; while x u0 j := c(x); if (M(uj,x)=‘+’) (uj,x) = (uj,x)+* else (x,uj) = (x,uj)- *; x = uj; { 0 ,7} {1,6} *=1 + + + {4,1} { 0,10} { ,} + + x = z, j = c(x) = 4 (u4,z) = (u4,z) + 1 x = u4 j = c(x) = 1 (u1,u4) = (u1,u4) + 1 x = u1 j = c(x) = 0 (u0,u1)=(u0,u1) + 1 x = u0. STOP. { 0,2} 2014-08-31 Dao Thanh Tinh 31
The Network Flow Problem (8) f =7 =1 f =8 f =2 f =7 =1 =1 =0 f =10 f =3 =0 =0 f =10 =0 f =15 f =3 =1 =1 u1 u4 z uo u2 u3 Định nghĩa W V\ {z}, a W, W* := V \W. Nhát cắt: (W,W*) ={ e=(u,v): u W, u W*} Dung lượng f(W,W*) =f(e), e (W,W*) Ví dụ: W = {u0, u1, u2} W*={u3, u4, z} (W,W*) = {(u0,u3), (u1,u4), (u2,u3)} f(W,W*) = 3+7+10 = 20 Định lý max z bằng giá trị bé nhất của các nhát cắt trong mạng T 2014-08-31 Dao Thanh Tinh 32
The Network Flow Problem (8) {2,2} {0,1} + { ,} + {0,2} f =7 f =7 =7 =7 f =8 f =8 f =2 f =2 f =7 f =7 =7 =7 =2 =2 =2 =2 f =10 f =10 f =3 f =3 =3 =3 =8 =8 f =10 f =10 =10 =10 f =15 f =15 f =3 f =3 =16 =16 =3 =3 u1 u1 u4 u4 z z uo uo u2 u2 u3 u3 Định lý max z = giá trị bé nhất của các nhát cắt trong mạng T • Chứng minh • Giả sử -luồng cực đại. • Thực hiện thủ tục gán nhãn. • Kí hiệu W ={xV: L(x)}, W* = V\W • Do a W, z W (W,W*) – nhát cắt. • Nếu cửa ra z W, L(z) , tăng luồng = +(z). Mâu thuẫn! Vì - luồng cực đại. • Xét(x,y)(W,W*).Rõ ràng (x,y) = f(x,y) • Nếu (x,y)<f(x,y) L(y) , yW, trái với giả thiết y W* • Xét (u,v)E, uW*, vW (u,v) = 0. • Nếu (u,v)>0 thì L(u) , uW. • Như vậy, (W,W*)=f(W,W*), (W*,W)=0. • Tự chứng minh: (W,W*)(W*,W) f(W,W*) = 18 2014-08-31 Dao Thanh Tinh 33
The Network Flow Problem (8) {2,2} {0,1} + { ,} + {0,2} f =7 f =7 =7 =7 f =8 f =8 f =2 f =2 f =7 f =7 =7 =7 =2 =2 =2 =2 f =10 f =10 f =3 f =3 =3 =3 =8 =8 f =10 f =10 =10 =10 f =15 f =15 f =3 f =3 =16 =16 =3 =3 u1 u1 u4 u4 z z uo uo u2 u2 u3 u3 Định lý max z = giá trị bé nhất của các nhát cắt trong mạng T Xét mạng đã gán nhãn với L(z)=. W = {u0, u1, u2, u4} W*={u3, z} (W,W*) = {(u0,u3), (u2,u3), (u4,u3), (u4,z)} f(W,W*) = 3+10+3+2 = 18 (W,W*) = 18 (W*,W) = 0 = 18 2014-08-31 Dao Thanh Tinh 34
The Network Flow Problem (8) Author(s) Y ear Complexity Ford; Fulkerson 1956 Edmonds; Karp 1969 O(E2V ) Dinic 1970 O(EV2) Karzanov 1973 O(V3) Cherkassky 1976 O(EV2) Malhotra; et al : 1978 O(V3) Galil 1978 O(V5/3.E2/3) Galil and Naamad 1979 O(EV.log2V ) Sleator and Tarjan 1980 O(EV.log V ) Goldberg and Tarjan 1985 O(EV.log (V2/E)) 2014-08-31 Dao Thanh Tinh 35
Mạng PERT (1) • Bài toán: • Dự án A có n công việc tên là 1, 2, …, n. Việc thứ i, i=1,..,n, có một số việc tiên quyết, lưu trong danh sách Ci, tức là bắt buộc phải thực hiện xong các việc trong Ci mới được thực hiện việc i. Trong điều kiện cho trước, việc i cần thời gian ti để hoàn thành. • Dự án A được khởi động vào thời điểm t0. • Tính thời điểm sớm nhất T có thể hoàn thành dự án A. • Trong thời hạn đã được nêu ra ở phần 1) hãy chỉ ra thời điểm bắt đầu sớm nhất, muộn nhất có thể được đối với từng công việc và thời gian dự trữ của từng công việc. 2014-08-31 Dao Thanh Tinh 36
Mạng PERT (2) Ví dụ P1: 2014-08-31 Dao Thanh Tinh 37
Mạng PERT (3) Sử dụng mô hình đồ thị có hướng G={V,E}: Mỗi công việc tương ứng với một đỉnh V ={1, 2,...,n}. Thêm vào 2 đỉnh đặc biệt là 0 và n+1, ý nghĩa là Khởi công và Kết thúc. t0 = 0, C0 = . Với i {1,...,n}, Ci= , đặt Ci= {0}, tn+1= 0, Cn+1={j {1,...,n}: jCk, k=1,2...,n} u Cv (u,v) E f(u,v) = tu. 2014-08-31 Dao Thanh Tinh 38
Mạng PERT (4) Thuật toán: Kí hiệu: xi – thời điểm sớm nhất bắt đầu việc i yi – thời điểm sớm nhất kết thúc việc i pi – thời điểm muộn nhất kết thúc việc i xj = max { xi + f(i,j) : i Cj }. pi = min { pj - f(i,j), j mà (i,j) E }. Đặt t0=0. Suy ra: x0=0, T = xn+1 = yn+1 = pn+1 2014-08-31 Dao Thanh Tinh 39
Mạng PERT (5) xj = max { xi + f(i,j) : i Cj }. 2014-08-31 Dao Thanh Tinh 40
Mạng PERT (6) pi = min { pj - f(i,j), j mà (i,j) E }. 2014-08-31 Dao Thanh Tinh 41
Mạng PERT (7) 2014-08-31 Dao Thanh Tinh 42