09. 最短路

download 09.  最短路

If you can't read please download the document

description

09. 最短路. 五島. 深さ優先以外の探索. 当然こちらを先に選ぶことも可能. 深さ優先以外の探索. 深さ優先探索: 「 visit した先にある」頂点を次に visit 一般 に は, 訪問済み 頂点に隣接したどの頂点も次に 訪問可能. 深さ優先探索が選ぶ頂点 :. 様々な探索戦略. 一般の優先度探索: 目的に応じた判断基準で優先度を決める 深さ優先探索 (depth first search) 開始点から遠い頂点を先に 幅優先探索 (breadth first search) 開始点に近い頂点を先に. 0. 1. 2. 3. - PowerPoint PPT Presentation

Transcript of 09. 最短路

09. 12visit visit

:3

(depth first search)

(breadth first search)431051-21-102-22-42-12-324: 1 hop>1 hopvisit(s, G, visited) { F = { s }; /* Frontier */ visited[s] = 1; while (F {}) { u = F.delete_one(); for v adjacents(u) { if (visited[v] == 0) { visited[v] = 1; F.add(v); } } }}visited[v] = 1 or 5F F F (Last-In-First-Out; LIFO) F F (First-In-First-Out: FIFO) F (priority queue) 6(): visited7(visited[v] = 1u v)s ()

bfs_visit(s, G, visited) { F = queue(s); /* C++ deque/list, Java : LinkedList */ visited[s] = 1; while (not F.is_empty()) { u = F.deq(); /* */ for v adjacents(u) { if (visited[v] == 0) { visited[v] = 1; F.enq(v); /* */ }}}}8962401357892

: 342713313410 (1/2) 2 2 2

U11 (2/2) (2)ex) 2 12 (1/2) (t, A) t A (t, A) (u, B) t A u B(t, A) (u, A) t u A u t(t, A) (*, B) t A B

13 (2/2)(1) (t, A) (u, B) A B t A u B 14 (2/2)3 4 |3 4| = 1 - 31234 124- 0 + 0 + 1 + 3 = 401-49 0263-

15Dijkstra Floyd 16 visit

bfs_visit(s, G, visited) { F = queue(s); /* C++ deque/list, Java : LinkedList */ visited[s] = 1; while (not F.is_empty()) { u = F.deq(); /* */ for v adjacents(u) { if (visited[v] == 0) { visited[v] = 1; F.enq(v); /* */ }}}}896240135717Dijkstra 18Dijkstra s * u u visit G = A, E s ( A) D[i] (i A) s i 19Dijkstra 9100101211UVFpqUVF: unvisited: visited: frontier21110120Dijkstra dijkstra (s, G) { V = {}; D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (V A) { pick u V that minimizes D; V = V + { u }; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) D[v] = d; } }}Wu,v u v121368445startgoal21Dijkstra S (start

121368445startgoal01640153901438014370143722Dijkstra i S D[i] s i i V D[i] S s i

dijkstra(s, G) { V = {}; D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (V A) { pick u V that minimizes D; V = V + { u }; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) D[v] = d; } }}S239100101211UVFpqUVF: unvisited: visited: frontier21110124V U V p ( F) p V p p V U p F q distance(s, p) > distance(s, q) + distance(p, q) , distance(p, q) 0 distance(s, p) > distance(s, q) 25dijkstra(s, G) { V = {}; D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (V A) { pick u V that minimizes D; V = V + { u }; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) D[v] = d; } }}while n D 2S V[i] = 1 iff i V; O(n) O(n2)26 Dijkstra F O(log n) O(log n)

O((n + m) log n)m O(n) O(n log n)etc.?dijkstra(s, G) { S = {}; D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (S V) { pick u V S that minimizes D; S = S + { u }; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) D[v] = d; } }}dijkstra (s, G) { T = priority_queue(V); D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (F {}) { delete u F that minimizes D; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) { D[v] = d; change priority of v in F to d; } } }}27? D P P[i]D[i] i s P[i] idijkstra(s, G) { S = {}; D = new int[n]; for (i = 0; i < n; i++) { if (i == s) D[i] = 0; else D[i] = ; } while (S V) { pick u V S that minimizes D; S = S + { u }; for v adjacents(u) { d = D[u] + Wu,v ; if (d < D[v]) { D[v] = d; P[v] = u; } } }}28

< >

O(log n)22103121032112103229 1 Dijkstra O(n3) O(n (n + m) log n)

2 FloydO(n3)30Floyd 31Floyd O(n3) G = V, E D[i][j] i j 2 DDijkstra 32Floyd (*) D[k][i][j] i j 0, 1, , k int D[1 : n 1][0 : n 1][0 : n 1];

floyd (graph G) { for (i = 0; i < n; i++) for (j = 0; j < n; j++) D[1][i][j] = G.weight(i, j);

for (k = 1; k < n + 1; k++) // (*) for (i = 0; i < n; i++) for (j = 0; j < n; j++) D[k][i][j] = min(D[k 1][i][j] , D[k 1][i][k] + D[k 1][k][j];}33D[k 1][i][j] 0, 1, , k 1 i, j D[k ][i][j] 0, 1, , k 1, k i, j D[k 1][i][j] 0, 1, , k 1 i, j k 34k D[k 1][i][j]ijkD[k 1][i][k]D[k 1][k][j]0, 1, , k 1 i, j 0, 1, , k 1 i, k 0, 1, , k 1 k, j D[k][i][j] = min(D[k 1][i][j], D[k 1][i][k] + D[k 1][k][j])0, 1, , k i, j 35k = 0 D[1][i][j]ij0D[1][i][0]D[1][0][j]i, j i, 0 0, j D[0][i][j] = min(D[1][i][j], D[1][i][0] + D[1][0][j])0 i, j 36k = 1 D[0][i][j]ij1D[0][i][1]D[0][1][j]0 i, j 0 i, 1 0 1, j D[1][i][j] = min(D[0][i][j], D[0][i][1] + D[0][1][j])0, 1 i, j 37012300110123013101311101230123001101234013120012300121012340131230012300123130122230131230D[k = 0]0 D[k = 1]0, 1 D[k = 3]0, 1, 2, 3 012300123140122340131230D[k = 2]0, 1, 2 D[k = 1]38Floyd D 23

O(n2) int D[n][n];

floyd (graph G) { for (i = 0; i < n; i++) for (j = 0; j < n; j++) D[i][j] = G.weight(i, j);

for (k = 0; k < n; k++) // (*) for (i = 0; i < n; i++) for (j = 0; j < n; j++) D[i][j] = min(D[i][j] , D[i][k] + D[k][j];}39 40 2

Dijkstra

4142ex) adjacents(u) ex) u v u v 43 448234715862347158612345678()?()?()?45 n visited heuristics46 adjacents(u) (visited) 2 O()4715248