https://leetcode.com/contest/weekly-contest-154/problems/critical-connections-in-a-network/
class Solution { public: vector<vector<int>> res; int index = 0; // 訪問序號 vector<int> dfn; // 當前訪問的序號 vector<int> low; // 當前節點&其子樹 最早訪問的序號 vector<vector<int>> graph; void tarjan(int cur, int last) { low[cur] = dfn[cur] = index++; // 分配一個序號 for (const auto& next : graph[cur]) { if(next == last) continue; // 避免重復訪問 if (dfn[next] == -1) { tarjan(next, cur); // 沒有訪問過,繼續搜索 low[cur] = min(low[cur], low[next]); // 更新最早序號 if(low[next] > dfn[cur]) // 新的節點的low已經大於當前節點的序號,說明已經不在同一個強聯通分量里了 { res.push_back({cur, next}); // 加入到結果中 } } else { low[cur] = min(low[cur], dfn[next]);// 訪問過了,直接更新 //low[cur] = min(low[cur], low[next]); -> I think this is right ! } } } vector<vector<int>> criticalConnections(int n, vector<vector<int>>& connections) { dfn.resize(n, -1); low.resize(n, -1); graph.resize(n); for (int i = 0; i < connections.size(); i++) { vector<int>& c = connections[i]; int v1 = c[0]; int v2 = c[1]; graph[v1].push_back(v2); graph[v2].push_back(v1); } tarjan(0, -1); // 處在同一個強聯通分量中節點, 最終會得到相同的low值 // for(int i = 0;i < n;i++) cout << low[i] << " " << dfn[i] << endl; return res; } };