<p>There are <code>n</code> servers numbered from <code>0</code> to <code>n - 1</code> connected by undirected server-to-server <code>connections</code> forming a network where <code>connections[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> represents a connection between servers <code>a<sub>i</sub></code> and <code>b<sub>i</sub></code>. Any server can reach other servers directly or indirectly through the network.</p>

<p>A <em>critical connection</em> is a connection that, if removed, will make some servers unable to reach some other server.</p>

<p>Return all critical connections in the network in any order.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2019/09/03/1537_ex1_2.png" style="width: 198px; height: 248px;" />
<pre>
<strong>Input:</strong> n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
<strong>Output:</strong> [[1,3]]
<strong>Explanation:</strong> [[3,1]] is also accepted.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> n = 2, connections = [[0,1]]
<strong>Output:</strong> [[0,1]]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>n - 1 &lt;= connections.length &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n - 1</code></li>
	<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
	<li>There are no repeated connections.</li>
</ul>

class Solution {
private:
    // int timer = 1;
    // void dfs(int node, int parent, vector<int> &vis,
    //          vector<int> adj[], int tin[], int low[], vector<vector<int>> &bridges) {
    //     vis[node] = 1;
    //     tin[node] = low[node] = timer;
    //     timer++;
    //     for (auto it : adj[node]) {
    //         // if (it == parent) continue;
    //         if (vis[it] == 0) {
    //             dfs(it, node, vis, adj, tin, low, bridges);
    //             low[node] = min(low[it], low[node]);
    //             // node --- it
    //             if (low[it] > tin[node]) {
    //                 bridges.push_back({it, node});
    //             }
    //         }
    //         else if(it!=parent){
    //             low[node] = min(low[node], low[it]);
    //         }
    //     }
    // }
public:
    vector<vector<int>> criticalConnections(int n,
    vector<vector<int>>& connections) {
        vector<int> adj[n];
        for (auto it : connections) {
            int u = it[0], v = it[1];
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
        int V = n;
        vector<int> low(V,0),vis(V,0);
        vector<int> tin(V,0) ;
        // set<int> isArt;
        vector<vector<int>> bridge;
        int timer = 0;
        function<void(int ,int)> dfs = [&](int node,int par){

            vis[node] = 1;
            tin[node] = low[node] = timer++;
            int children= 0;
            for(auto i:adj[node])
            {
                // if(i == par) continue;
                if(!vis[i])
                {
                    dfs(i,node);
                    low[node] = min(low[node],low[i]);
                    if(low[i] > tin[node])
                    {
                        bridge.push_back({node,i});
                        // isArt.push_back(node);
                        // break;
                    }
                    children++;
                }
                else if(i != par){
                    low[node] = min(low[node] , tin[i]);
                }
                
            }
            // cout<<children<<" "<<node<<endl;
            // if(par == -1 && children>1)
            // {
            // isArt.insert(node);
            //     isArt.push_back(node);
            // }
        };
        
        for(int i=0;i<V;i++)
        {
            if(!vis[i])
            {
                dfs(i,-1);
            }
        }
        
        
        
        // if(bridge.size() == 0)
        // return {{-1}};
        // sort(isArt.begin() ,isArt.end());
        // vector<int> ans;
        // for(auto i: isArt)
        // {
        //     ans.push_back(i);
        // }
        return bridge;

    }
};
179398