题目
在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。
输入一个有向图,该图由一个有着 [公式] 个节点(节点值不重复 [公式])的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。 每一个边 的元素是一对 [公式],用以表示有向图中连接顶点 [公式] 和 [公式] 和顶点的边,其中父节点 [公式] 是子节点 [公式] 的一个父节点。
返回一条能删除的边,使得剩下的图是有 [公式] 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。
solution
- 如果入度为2,则从后往前,判断每个删除该条edge后,图中是否还存在环
- 如果入度都为1,那么从前往往后,判断每添加一条 edge后,图中是否存在环
- 使用查询集来构造这棵树
import numpy as np
class Solution(object):
def findRedundantDirectedConnection(self, edges):
"""
:type edges: List[List[int]]
:rtype: List[int]
"""
## 查看是否存在入度为 2 的点
self.n = len(edges)
degree = [0] * (self.n+1)
for u, v in edges:
degree[v] += 1
for u, v in edges[::-1]:
if degree[v] == 2 and len(self.findWrongEdges(edges, [u, v])) == 0:
return [u, v]
return self.findWrongEdges(edges, [])
### 检查删除某条边之后是否存在环
return self.findWrongEdges(edges,[])
def find(self,x):
if self.p[x] == x:
return x
return self.find(self.p[x])
def merge(self,u,v):
rootu,rootv = self.find(u),self.find(v)
if rootu==rootv:
return
self.p[rootv] = rootu
def same(self,u,v):
rootu,rootv = self.find(u),self.find(v)
if rootu==rootv:
return True
return False
def findWrongEdges(self,edges,ed):
self.p =[p for p in range(len(edges)+1)]
for u,v in edges:
if[u,v] == ed:
continue
# 增加u,v后成环
if self.same(u,v)==True:
return [u,v]
self.merge(u,v)
return []