题目描述
There are n servers numbered from 0 to n-1 connected by undirected server-to-server connections forming a network where connections[i] = [a, b] represents a connection between servers a and b. Any server can reach any other server directly or indirectly through the network.
A critical connection is a connection that, if removed, will make some server unable to reach some other server.
Return all critical connections in the network in any order.
1 | n = 4, connections = [[0,1],[1,2],[2,0],[1,3]] |
1 | Output: [[1,3]] |
1 | Explanation: |
解析
这是Amazon OA上的一道题,可以利用Trajan算法解决,说实话,这种考法比较无聊,如果你熟悉Tarjan就能轻松秒杀,反之死活想不出来,没有什么区分度,不过既然亚麻考了这题,还是有必要熟悉下的,我OA没有碰到,但有准备过。
这道题目的关键是理解Bridge的含义,即连通两个连通分量的桥,根据观察我们可以发现这个Critical Connection或者说Bridge不应该出现在一个环里,Tarjan算法的核心在于,找到环,它采用了一种比较巧妙的思路,即记录每个节点第一次发现的位置,如果没有环,显然这个位置是不断增大的,如果发现某个节点可以通往比它位置小的节点则说明出现了环。
理解了这个思路,用DFS搜索图,保存第一次出现的位置和所能到达的最小位置,如果前者小于后者,则说明没有环,则这条路径是Bridge也就是Critical Connection
代码
1 | public List<List<Integer>> criticalConnections(int n, List<List<Integer>> connections) { |