[leetcode] 1192 critical-connections-in-a-network


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;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM