Bài giảng Thuật toán ứng dụng: Tarjan DFS algorithm for finding bridges and articulation points
lượt xem 4
download
Bài giảng Thuật toán ứng dụng: Tarjan DFS algorithm for finding bridges and articulation points. Chương này cung cấp cho học viên những nội dung về: duyệt theo chiều sâu; cây DFS; cấu trúc dữ liệu duy trì;... Mời các bạn cùng tham khảo chi tiết nội dung bài giảng!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Thuật toán ứng dụng: Tarjan DFS algorithm for finding bridges and articulation points
- THUẬT TOÁN ỨNG DỤNG Tarjan DFS algorithm for finding Bridges and Articulation Points Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn 1
- Duyệt theo chiều sâu Cây DFS DFS xuất phát từ một đỉnh cho phép thăm các đỉnh con cháu của nó trên cây DFS Cấu trúc dữ liệu duy trì num[v]: thời điểm đỉnh v được thăm low[v]: giá trị num nhỏ nhất của các đỉnh x sao cho có cạnh ngược (u,x) với u là 1 đỉnh con cháu nào đó của v 2
- DFS(6) 6 1 4 3 2 8 5 9 7 3
- DFS(6) 6 num[6] = 1, low[6] = 1 4
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 5
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 3 6
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 3 2 7
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 2 8 8
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = 6 2 8 5 9
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = 6 num[9] = 7, low[9] = 7 2 8 5 9 10
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = 6 num[9] = 7, low[9] = num[2] = 4 2 8 5 9 11
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = 6 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = 8 8 5 9 7 12
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = 6 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 8 5 9 7 13
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = 5 3 num[5] = 6, low[5] = low[9] = 4 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 8 5 9 7 14
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = 3 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = low[5] = 4 3 num[5] = 6, low[5] = low[9] = 4 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 8 5 9 7 15
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = 2 1 num[3] = 3, low[3] = num[6] = 1 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = low[5] = 4 3 num[5] = 6, low[5] = low[9] = 4 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 8 5 9 7 16
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = low[3] = 1 1 num[3] = 3, low[3] = num[6] = 1 num[2] = 4, low[2] = 4 num[8] = 5, low[8] = low[5] = 4 3 num[5] = 6, low[5] = low[9] = 4 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 8 5 9 7 17
- DFS(6) 6 num[6] = 1, low[6] = 1 num[1] = 2, low[[1] = low[3] = 1 1 num[3] = 3, low[3] = num[6] = 1 num[2] = 4, low[2] = 4 4 num[8] = 5, low[8] = low[5] = 4 3 num[5] = 6, low[5] = low[9] = 4 num[9] = 7, low[9] = num[2] = 4 2 num[7] = 8, low[7] = num[8] = 5 num[4] = 9, low[4] = 9 8 5 9 7 18
- Sample code #include using namespace std; const int N = 10000; int n,m; vector A[N]; bool visited[N]; int num[N]; int low[N]; int t; vector bridges; void input(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i = 1; i > u >> v; A[u].push_back(v); A[v].push_back(u); } } 19
- Sample code void dfs(int s, int ps){ // DFS from s with ps is the parent of s in the DFS tree t++; num[s] = t; low[s] = num[s]; visited[s] = true; for(int i = 0;i < A[s].size(); i++){ int v = A[s][i]; if(v == ps) continue; if(visited[v]){ low[s] = min(low[s],num[v]); }else{ dfs(v,s); low[s] = min(low[s],low[v]); if(low[v] > num[s]){ // discover a bridge (s,v) bridges.push_back(make_pair(s,v)); } } } } 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Thuật toán ứng dụng: Quy hoạch động - Trương Xuân Nam
25 p | 49 | 8
-
Bài giảng Thuật toán ứng dụng: Đệ quy quay lui
66 p | 42 | 7
-
Bài giảng Thuật toán ứng dụng: Thuật toán tham lam
42 p | 12 | 7
-
Bài giảng Thuật toán ứng dụng: Thuật toán Tham lam - Trương Xuân Nam
23 p | 76 | 7
-
Bài giảng Thuật toán ứng dụng: Tiếp cận chia để trị - Trương Xuân Nam
21 p | 44 | 5
-
Bài giảng Thuật toán ứng dụng: Đệ quy-Quay lui-Nhánh cận - Trương Xuân Nam
29 p | 59 | 5
-
Bài giảng Thuật toán ứng dụng: Thuật toán xử lý xâu
89 p | 12 | 5
-
Bài giảng Thuật toán ứng dụng: Thuật toán cơ bản trên đồ thị không trọng số
182 p | 9 | 5
-
Bài giảng Thuật toán ứng dụng: Tư duy thuật toán và cấu trúc dữ liệu, kỹ năng lập trình
55 p | 11 | 4
-
Bài giảng Thuật toán ứng dụng: Lý thuyết NP-đầy-đủ
53 p | 12 | 4
-
Bài giảng Thuật toán ứng dụng: Graphs
141 p | 25 | 4
-
Bài giảng Thuật toán ứng dụng: Chương 1 - Đỗ Phan Thuận
46 p | 35 | 4
-
Bài giảng Thuật toán ứng dụng: Đệ qui và nhánh cận
48 p | 14 | 4
-
Bài giảng Thuật toán ứng dụng: Chương 3 - Đỗ Phan Thuận
32 p | 26 | 3
-
Bài giảng Thuật toán ứng dụng: Chương 2 - Đỗ Phan Thuận
45 p | 22 | 3
-
Bài giảng Thuật toán ứng dụng: Đồ thị - Trương Xuân Nam
32 p | 38 | 3
-
Bài giảng Thuật toán ứng dụng: Thuật toán và Phân tích Thuật toán - Trương Xuân Nam
34 p | 60 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn