Bài giảng Toán rời rạc - Bài 18: Đường đi trên đồ thị (Version 0.2) - Trần Vĩnh Đức

Tìm kiếm theo chiều rộng (Breadth-First Search) Chia đồ thị thành các mức: ▶ S là mức có khoảng cách 0. ▶ Các đỉnh có khoảng cách tới S bằng 1. ▶ Các đỉnh có khoảng cách tới S bằng 2 Ý tưởng thuật toán: Khi mức d đã được xác định, mức d + 1 có thể thăm bằng cách duyệt qua các hàng xóm của mức d

pdf52 trang | Chia sẻ: thuyduongbt11 | Ngày: 11/06/2022 | Lượt xem: 318 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Toán rời rạc - Bài 18: Đường đi trên đồ thị (Version 0.2) - Trần Vĩnh Đức, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Đường đi trên đồ thị (Version 0.2) Trần Vĩnh Đức HUST Ngày 24 tháng 7 năm 2018 1 / 52 Tài liệu tham khảo ▶ S. Dasgupta, C. H. Papadimitriou, and U. V. Vazirani, Algorithms, July 18, 2016. ▶ Chú ý: Nhiều hình vẽ trong tài liệu được lấy tùy tiện mà chưa xin phép. 2 / 52 Nội dung Khoảng cách và tìm kiếm theo chiều rộng Thuật toán Dijkstra Cài đặt hàng đợi ưu tiên Đường đi ngắn nhất khi có cạnh độ dài âm Đường đi ngắn nhất trong một DAG DFS và đường đi P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Paths in graphs 4.1 Distances Depth-first search readily identifies all the vertices of a graph that can be reached from a designated starting point. It also finds explicit paths to these vertices, sum- marized in its search tree (Figure 4.1). However, these paths might not be the most economical ones possible. In the figure, vertex C is reachable from S by traversing just one edge, while the DFS tree shows a path of length 3. This chapter is about algorithms for finding shortest paths in graphs. Path lengths allow us to talk quantitatively about the extent to which different vertices of a graph are separated from each other: The distance between two nodes is the length of the shortest path between them. To get a concrete feel for this notion, consider a physical realization of a graph that has a ball for each vertex and a piece of string for each edge. If you lift the ball for vertex s high enough, the other balls that get pulled up along with it are precisely the vertices reachable from s. And to find their distances from s, you need only measure how far below s they hang. In Figure 4.2, for example, vertex B is at distance 2 from S, and there are two shortest paths to it. Whe S is held up, the strings along each of these paths become taut. Figure 4.1 (a) A simple graph and (b) its depth-first search tree. (a) E AS BD C (b) S A B D E C 104 P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Paths in graphs 4.1 Distances Depth-first search readily identifies all the vertices of a graph that can be reached from a designated starting point. It also finds explicit paths to these vertices, sum- marized in its search tree (Figure 4.1). However, these paths might not be the most economical ones possible. In the figure, vertex C is reachable from S by traversing just one edge, while the DFS tree shows a path of length 3. This chapter is about algorithms for finding shortest paths in graphs. Path lengths allow us to talk quantitatively about the extent to which different vertices of a graph are separated from each other: The distance between two nodes is the length of the shortest path between them. To get a concrete feel for this notion, consider a physical realization f a graph hat has a ball for each vertex and a piece of string for each edge. If you lift the ball for vertex s high enough, the other balls that get pulled up along with it ar precisely the vertices reachable from s. And to find their distances from s, you need only measure how far below s they hang. In Figure 4.2, for example, vertex B is at distance 2 from S, and there are two shortest paths to it. When S is held up, the strings along each of these paths become taut. Figure 4.1 (a) A simple graph and (b) its depth-first search tree. (a) E AS BD C (b) S A B D E C 104 Đường đi trên cây DFS thường không phải là đường đi ngắn nhất. 4 / 52 Khoảng cách Khoảng cách giữa hai đỉnh là độ dài của đường đi ngắn nhất giữa chúng. P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Paths in graphs 4.1 Distances Depth-first search readily identifies all the vertices of a graph that can be reached from a designated starting point. It also finds explicit paths to these vertices, sum- marized in its search tree (Figure 4.1). However, these paths might not be the most economical ones possible. In the figure, vertex C is reachable from S by traversing just one edge, while the DFS tree shows a path of length 3. This chapter is about algorithms for finding shortest paths in graphs. Path lengths allow us to talk quantitatively about the extent to which different vertices of a graph are separated from each other: The distance between two nodes is the length of the shortest path between them. To get a concrete feel for this notion, consider a physical realization of a graph that has a ball for each vertex and a piece of string for each edge. If you lift the ball for vertex s high enough, the other balls that get pulled up along with it are precisely the vertices reachable from s. And to find their distances from s, you need only measure how far below s they hang. In Figure 4.2, for example, vertex B is at distance 2 from S, and there are two shortest paths to it. When S is held up, the strings along each of these paths become taut. Figure 4.1 (a) A simple graph and (b) its depth-first search tree. (a) E AS BD C (b) S A B D E C 104 v Khoảng cách (S− v) A B C D E 5 / 52 Mô hình vật lý của đồ thị Giả sử rằng mọi cạnh có cùng độ dài. Ta nhấc đỉnh S lên: P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Algorithms 105 Figure 4.2 A physical model of a graph. B E S D C A D EC B A S On the other hand, edge (D, E ) plays no role in any shortest path and therefore remains slack. 4.2 Breadth-first search In Figure 4.2, the lifting of s partitions the graph into layers: s itself, the nodes at distance 1 from it, the nodes at distance 2 from it, and so on. A convenient way to compute distances from s to the other vertices is to proceed layer by layer. Once we have picked out the nodes at distance 0, 1, 2, . . . , d, the ones at d + 1 are easily determined: they are precisely the as-yet-unseen nodes that are adjacent to the layer at distance d. This suggests an iterative algorithm in which two layers are active at any given time: some layer d, which has been fully identified, and d + 1, which is being discovered by scanning the neighbors of layer d. Breadth-first search (BFS) directly implements this simple reasoning (Figure 4.3). Initially the queue Q consists only of s, the one node at distance 0. And for each subsequent distance d = 1, 2, 3, . . . , there is a point in time at which Q contains all the nodes at distance d and nothing else. As these nodes are processed (ejected off the front of the queue), their as-yet-unseen neighbors are injected into the end of the queue. Let’s try out this algorithm on our earlier example (Figure 4.1) to confirm that it does the right thing. If S is the starting point and the nodes are ordered alphabetically, they get visited in the sequence shown in Figure 4.4. The breadth-first search tree, on the right, contains the edges through which each node is initially discovered. Unlike the DFS tree we saw earlier, it has the property that all its paths from S are the shortest possible. It is therefore a shortest-path tree. Correctness and efficiency We have developed the basic intuition behind breadth-first search. In order to check that the algorithm works correctly, we need to make sure that it faithfully executes this intuition. What we expect, precisely, is that For each d = 0, 1, 2, . . . , there is a moment at which (1) all nodes at distance ≤ d from s have their distances correctly set; (2) all other nodes have their distances set to∞; and (3) the queue contains exactly the nodes at distance d. P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Algorithms 105 Figure 4.2 A physical model of a graph. B E S D C A D EC B A S On the other hand, edge (D, E ) plays no role in any shortest path and therefore remains slack. 4.2 Breadth-first search In Figure 4.2, the lifting ofs partitions the grap int layers:s itself, the nodes at distance 1 from it, the nodes at di tance 2 from it, and so on. A convenient way to compute distances from s to the other v rtices is to proceed layer by layer. Once we have picked out the nodes at distan e 0, 1, 2, . . . , d, th ones at d + 1 are easily determined: they are pre isely t e as-yet-unseen nod s that are adjacent to the layer at distance d. This suggests an iterative algorit m in which two layers are active at any given time: some layer d, which has been fully identified, and d + 1, which is being discovered by scanning the neighbors of layer d. Breadth-first search (BFS) directly implements this simple reasoning (Figure 4.3). Initially the queue Q consists only of s, the one node at distance 0. And for each subsequent distance d = 1, 2, 3, . . . , there is a point in time at which Q contains all the nodes at distance d and nothing else. As these nodes are processed (ejected off the front of the queue), their as-yet-unseen neighbors are injected into the end of the queue. Let’s try out this algorithm on our earlier example (Figure 4.1) to confirm that it does the right thing. If S is the starting point and the nodes are ordered alphabetically, they get visited in the sequence shown in Figure 4.4. The breadth-first search tree, on the right, contains the edges through which eac node is initially discovered. Unlike the DFS tree we saw earlier, it has the property that all its paths from S are the shortest possible. It is therefore a shortest-path tree. Correctness and effici ncy We have developed the basic intuition behind breadth-fir t search. In order to check that the algorithm works correctly, we need to make sure that it faithfully executes this intuition. What we expect, precisely, is that For each d = 0, 1, 2, . . . , there is a moment at which (1) all nodes at distance ≤ d from s have their distances correctly set; (2) all other nodes have their distances set to∞; and (3) the queue contains exactly the nodes at distance d. 6 / 52 Tìm kiếm theo chiều rộng (Breadth-First Search) Chia đồ thị thành các mức: ▶ S là mức có khoảng cách 0. ▶ Các đỉnh có khoảng cách tới S bằng 1. ▶ Các đỉnh có khoảng cách tới S bằng 2 ▶ ... P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Algorithms 105 Figure 4.2 A physical model of a graph. B E S D C A D EC B A S On the other hand, edge (D, E ) plays no role in any shortest path and therefore remains slack. 4.2 Breadth-first search In Figure 4.2, the lifting ofs partitions the graph into layers:s itself, the nodes at distance 1 from it, the nodes at distance 2 from it, and so on. A convenient way to compute distances from s to the other vertices is to proceed layer by layer. Once we have picked out the nodes at distance 0, 1, 2, . . . , d, the ones at d + 1 are easily determined: they are precisely the as-yet-unseen nodes that are adjacent to the layer at distance d. This suggests an iterative algorithm in which two layers are active at any given time: some layer d, which has been fully identified, and d + 1, which is being discovered by scanning the neighbors of layer d. Breadth-first search (BFS) directly implements this simple reasoning (Figure 4.3). Initially the queue Q consists only of s, the one node at distance 0. And for each subsequent distance d = 1, 2, 3, . . . , there is a point in time at which Q contains all the nodes at distance d and nothing else. As these nodes are processed (ejected off the front of the queue), their as-yet-unseen neighbors are injected into the end of the queue. Let’s try out this algorithm on our earlier example (Figure 4.1) to confirm that it does the right thing. If S is the starting point and the nodes are ordered alphabetically, they get visited in the sequence shown in Figure 4.4. The breadth-first search tree, on the right, contains the edges through which each node is initially discovered. Unlike the DFS tree we saw earlier, it has the property that all its paths from S are the shortest possible. It is therefore a shortest-path tree. Correctness and efficiency We have developed the basic intuition behind breadth-first search. In order to check that the algorithm works correctly, we need to make sure that it faithfully executes this intuition. What we expect, precisely, is that For each d = 0, 1, 2, . . . , there is a moment at which (1) all nodes at distance ≤ d from s have their distances correctly set; (2) all other nodes have their distances set to∞; and (3) the queue contains exactly the nodes at distance d. Ý tưởng thuật toán: Khi mức d đã được xác định, mức d+ 1 có thể thăm bằng cách duyệt qua các hàng xóm của mức d. 7 / 52 Ý tưởng loang theo chiều rộng Khởi tạo: Hàng đợi Q chỉ chứa đỉnh s, là đỉnh duy nhất ở mức 0. Với mỗi khoảng cách d = 1, 2, 3, . . . , ▶ sẽ có thời điểm Q chỉ chứa các đỉnh có khoảng cách d và không có gì khác. ▶ Khi đó các đỉnh có khoảng cách d này sẽ được loại bỏ dần từ đầu hàng đợi, ▶ và các hàng xóm chưa được thăm sẽ được thêm vào cuối hàng đợi. 8 / 52 Bài tập Chạy thuật toán BFS cho đồ thị dưới đây bắt đầu từ đỉnh S. Ghi ra hàng đợi Q sau mỗi lần thăm đỉnh. P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Paths in graphs 4.1 Distances Depth-first search readily identifies all the vertices of a graph that can be reached from a designated starting point. It also finds explicit paths to these vertices, sum- marized in its search tree (Figure 4.1). However, these paths might not be the most economical ones possible. In the figure, vertex C is reachable from S by traversing just one edge, while the DFS tree shows a path of length 3. This chapter is about algorithms for finding shortest paths in graphs. Path lengths allow us to talk quantitatively about the extent to which different vertices of a graph are separated from each other: The distance between two nodes is the length of the shortest path between them. To get a concrete feel for this notion, consider a physical realization of a graph that has a ball for each vertex and a piece of string for each edge. If you lift the ball for vertex s high enough, the other balls that get pulled up along with it are precisely the vertices reachable from s. And to find their distances from s, you need only measure how far below s they hang. In Figure 4.2, for example, vertex B is at distance 2 from S, and there are two shortest paths to it. When S is held up, the strings along each of these paths become taut. Figure 4.1 (a) A simple graph and (b) its depth-first search tree. (a) E AS BD C (b) S A B D E C 104 Đỉnh thăm Hàng đợi S [S] 9 / 52 procedure bfs(G, s) Input: đồ thị G = (V,E), có hướng hoặc vô hướng; một đỉnh s ∈ V Output: Với mỗi đỉnh u đến được từ s, dist(u) = khoảng cách từ s tới u. for all u ∈ V: dist(u) = ∞ dist(s) = 0 Q = [s] (hàng đợi chỉ chứa s) while Q khác rỗng: u = eject(Q) (loại bỏ u khỏi hàng đợi) for all edges (u, v) ∈ E: if dist(v) = ∞: inject(Q, v) (thêm v vào hàng đợi) dist(v) = dist(u) + 1 10 / 52 Bài tập Hãy chạy thuật toán BFS cho đồ thị dưới đây và ghi ra nội dung của hàng đợi Q sau mỗi bước: P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Paths in graphs 4.1 Distances Depth-first search readily identifies all the vertices of a graph that can be reached from a designated starting point. It also finds explicit paths to these vertices, sum- marized in its search tree (Figure 4.1). However, these paths might not be the most economical ones possible. In the figure, vertex C is reachable from S by traversing just one edge, while the DFS tree shows a path of length 3. This chapter is about algorithms for finding shortest paths in graphs. Path lengths allow us to talk quantitatively about the extent to which different vertices of a graph are separated from each other: The distance between two nodes is the length of the shortest path between them. To get a concrete feel for this notion, consider a physical realization of a graph that has a ball for each vertex and a piece of string for each edge. If you lift the ball for vertex s high enough, the other balls that get pulled up along with it are precisely the vertices reachable from s. And to find their distances from s, you need only measure how far below s they hang. In Figure 4.2, for example, vertex B is at distance 2 from S, and there are two shortest paths to it. When S is held up, the strings along each of these paths become taut. Figure 4.1 (a) A simple graph and (b) its depth-first search tree. (a) E AS BD C (b) S A B D E C 104 Thứ tự thăm đỉnh Hàng đợi S [S] 11 / 52 Nội dung Khoảng cách và tìm kiếm theo chiều rộng Thuật toán Dijkstra Cài đặt hàng đợi ưu tiên Đường đi ngắn nhất khi có cạnh độ dài âm Đường đi ngắn nhất trong một DAG Độ dài của cạnh P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 Chapter 4 Algorithms 107 and extremely useful properties we saw in Chapter 3. But it also means that DFS can end up taking a long and convoluted route to a vertex that is actually very close by, as in Figure 4.1. Breadth-first search makes sure to visit vertices in in- creasing order of their distance from the starting point. This is a broader, shal- lower search, rather like the propagation of a wave upon water. And it is achieved using almost exactly the same code as DFS—but with a queue in place of a stack. Also notice one stylistic difference from DFS: since we are only interested in dis- tances from s, we do not restart the search in other connected components. Nodes not reachable from s are simply ignored. 4.3 Lengths on edges Breadth-first search treats all edges as having the same length. This is rarely true in applications where shortest paths are to be found. For instance, suppose you are driving from San Francisco to Las Vegas, and want to find the quickest route. Figure 4.5 shows the major highways you might conceivably use. Picking the right combination of them is a shortest-path problem in which the length of each edge (each stretch of highway) is important. For the remainder of this chapter, we will deal with this more general scenario, annotating every edge e ∈ E with a length le. If e = (u, v), we will sometimes also write l(u, v) or luv. Figure 4.5 Edge lengths often matter. Francisco San Los Angeles Bakersfield Sacramento Reno Las Vegas 409 290 95 271 133 445 291 112 275 These le’s do not have to correspond to physical lengths. They could denote time (driving time between cities) or money (cost of taking a bus), or any other quantity that we would like to conserve. In fact, there are cases in which we need to use negative lengths, but we will briefly overlook this particular complication. Trong các bài toán thực tế, mỗi cạnh e thường gắn với độ dài le. 13 / 52 Câu hỏi Liệu ta có thể sửa thuật toán BFS để nó chạy được trên đồ thị tổng quát G = (V,E) trong đó mỗi cạnh có độ dài nguyên dương le? 14 / 52 Tách cạnh thành các cạnh với độ dài đơn vị P1: OSO/OVY P2: OSO/OVY QC: OSO/OVY T1: OSO das23402 Ch04 GTBL020-Dasgupta-v10 August 12, 2006 1:48 108 4.4 Dijkstra’s algorithm 4.4 Dijkstra’s algorithm 4.4.1 An adaptation of breadth-first search Breadth-first search finds shortest paths in any graph whose edges have unit length. Can we adapt it to a more general graph G = (V, E ) whose edge lengths le are positive integers? A more convenient graph Here is a simple trick for converting G into something BFS can handle: break G ’s long edges into unit-length pieces by introducing “dummy” nodes. Figure 4.6 shows an example of this transformation. To construct t