还是有点晦涩难懂
1 vector<int> low; 2 vector<int> dfn; 3 vector<int> father; 4 vector<vector<int>> g; 5 int time = 0; 6 void tarjan(int i, int ifather) 7 { 8 father[i] = ifather; 9 low[i] = time; 10 dfn[i] = time; 11 time++; 12 for (int j = 0; j < g[i].size(); j++) 13 { 14 if (g[i][j] == father[i]) 15 continue; 16 else if (dfn[g[i][j]] == -1) 17 { 18 tarjan(g[i][j], i); 19 low[i] = min(low[i], low[g[i][j]]); 20 } 21 else 22 low[i] = min(low[i], dfn[g[i][j]]); 23 } 24 } 25 vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) { 26 vector<int> use(n, -1); 27 vector<vector<int>> g1(n, vector<int>()); 28 g = g1; 29 low = use; 30 dfn = use; 31 father = use; 32 for (auto e : connections) 33 { 34 g[e[0]].push_back(e[1]); 35 g[e[1]].push_back(e[0]); 36 } 37 tarjan(0, -1); 38 vector<vector<int>> ans; 39 for (int i = 0; i < n; i++) 40 { 41 int f = father[i]; 42 if (father[i] >= 0 && low[i] > dfn[f]) 43 { 44 vector<int> temp; 45 temp.push_back(i); 46 temp.push_back(f); 47 ans.push_back(temp); 48 } 49 } 50 return ans; 51 }