为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode1192. 查找集群内的「关键连接」| Critical Connections in a Network

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11521660.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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.

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.

 

Example 1:

Input: n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
Output: [[1,3]]
Explanation: [[3,1]] is also accepted.

 

Constraints:

  • 1 <= n <= 10^5
  • n-1 <= connections.length <= 10^5
  • connections[i][0] != connections[i][1]
  • There are no repeated connections.

力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。

它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群,其中连接 connections 是无向的。

从形式上讲,connections[i] = [a, b] 表示服务器 a 和 b 之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。

「关键连接」是在该集群中的重要连接,也就是说,假如我们将它移除,便会导致某些服务器无法访问其他服务器。

请你以任意顺序返回该集群内的所有 「关键连接」。

 

示例 1:

输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]]
输出:[[1,3]]
解释:[[3,1]] 也是正确的。

 

提示:

  • 1 <= n <= 10^5
  • n-1 <= connections.length <= 10^5
  • connections[i][0] != connections[i][1]
  • 不存在重复的连接

Runtime: 2832 ms
Memory Usage: 52.7 MB
 1 class Solution {
 2     var v:[[Int]] = [[Int]]()
 3     var dfn:[Int] = [Int]()
 4     var low:[Int] = [Int]()
 5     var times:Int = 0
 6     var ret:[[Int]] = [[Int]]()
 7     
 8     func criticalConnections(_ n: Int, _ connections: [[Int]]) -> [[Int]] {
 9         v = [[Int]](repeating:[Int](),count:n)
10         dfn = [Int](repeating:0,count:n)
11         low = [Int](repeating:0,count:n)
12         for e in connections
13         {
14             v[e[0]].append(e[1])
15             v[e[1]].append(e[0])
16         }
17         for i in 0..<n
18         {
19             if dfn[i] == 0
20             {
21                 tarjan(i, -1)
22             }
23         }
24         return ret
25     }
26     
27     func tarjan(_ x:Int,_ p:Int)
28     {
29         times += 1
30         dfn[x] = times
31         low[x] = times
32         for y in v[x]
33         {
34             if y == p {continue}
35             if dfn[y] == 0
36             {
37                 tarjan(y, x)
38                 low[x] = min(low[x], low[y])
39                 if low[y] > dfn[x]
40                 {
41                     ret.append([x, y])
42                 }
43             }
44             else
45             {
46                 low[x] = min(low[x], dfn[y])
47             }
48         }
49     }
50 }

 

posted @ 2019-09-15 12:04  为敢技术  阅读(546)  评论(0编辑  收藏  举报