LeetCode 685

题目

在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。

输入一个有向图,该图由一个有着 [公式] 个节点(节点值不重复 [公式])的树及一条附加的边构成。附加的边的两个顶点包含在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 []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值