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!
Trang 1Tarjan DFS algorithm for finding Bridges
and Articulation Points
THUẬT TOÁN ỨNG DỤNG
1
Phạm Quang Dũng
Bộ môn KHMTdungpq@soict.hust.edu.vn
Trang 2Duyệt theo chiều sâu
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
Trang 44
6 num[6] = 1, low[6] = 1
Trang 7num[6] = 1, low[6] = 1num[1] = 2, low[[1] = 2num[3] = 3, low[3] = 3num[2] = 4, low[2] = 4
Trang 8num[6] = 1, low[6] = 1num[1] = 2, low[[1] = 2num[3] = 3, low[3] = 3num[2] = 4, low[2] = 4num[8] = 5, low[8] = 5
Trang 95
num[6] = 1, low[6] = 1num[1] = 2, low[[1] = 2num[3] = 3, low[3] = 3num[2] = 4, low[2] = 4num[8] = 5, low[8] = 5num[5] = 6, low[5] = 6
Trang 105 9
num[6] = 1, low[6] = 1num[1] = 2, low[[1] = 2num[3] = 3, low[3] = 3num[2] = 4, low[2] = 4num[8] = 5, low[8] = 5num[5] = 6, low[5] = 6num[9] = 7, low[9] = 7
Trang 115 9
num[6] = 1, low[6] = 1num[1] = 2, low[[1] = 2num[3] = 3, low[3] = 3num[2] = 4, low[2] = 4num[8] = 5, low[8] = 5num[5] = 6, low[5] = 6num[9] = 7, low[9] = num[2] = 4
Trang 16num[8] = 5, low[8] = low[5] = 4num[5] = 6, low[5] = low[9] = 4num[9] = 7, low[9] = num[2] = 4num[7] = 8, low[7] = num[8] = 5
Trang 17num[8] = 5, low[8] = low[5] = 4num[5] = 6, low[5] = low[9] = 4num[9] = 7, low[9] = num[2] = 4num[7] = 8, low[7] = num[8] = 5
Trang 18num[8] = 5, low[8] = low[5] = 4num[5] = 6, low[5] = low[9] = 4num[9] = 7, low[9] = num[2] = 4num[7] = 8, low[7] = num[8] = 5num[4] = 9, low[4] = 9
Trang 20Sample code
20
void dfs(int s, int ps){
// DFS from s with ps is the parent of s in the DFS tree t++;
} } } }
Trang 21for(int i = 0; i < bridges.size(); i++){
cout << "(" << bridges[i].first << "," << bridges[i].second << ") "; }