684. Redundant Connection

题目链接:https://leetcode.com/problems/redundant-connection/description/
在一个有N个节点的无向图中,一共有N条边,要求从图中的边中删除一条边,删除这条边后的图是一颗树。在一棵树有N个节点,有N-1条边。如果有N条边,那么一定存在环。只需要把环中的一条边删除就可以,环上的边不止一条,那么按照输入顺序,删除输入顺序中环的最后一条边即可。那么问题来了,如何判断图中有没有环呢?我用的是并查集。其思想为,如果一条边上的两个节点有相同的父节点,那么加上这条边之后将构成一个环,那么这条边即为解。

class Solution(object):
    def findFather(self,root,paths):
        '''
        寻找根节点
        '''
        while paths[root]!=root:
            root=self.findFather(paths[root],paths)
        return root
    def isCycle(self,first,second,paths):
        '''
        判断是否构成环
        '''
        first_father=self.findFather(first,paths)#寻找父节点
        second_father=self.findFather(second,paths)#寻找父节点
        ans=(True if first_father==second_father else False)#如果父节点相同,那么将构成环
        return first_father,second_father,ans
    def findRedundantConnection(self, edges):
        """
        :type edges: List[List[int]]
        :rtype: List[int]
        """
        length_node=len(edges)
        paths=[i for i in range(length_node+1) ]
        for [first,second] in edges:
            #判断加上[first,second]这条是否构成一条边
            first_father,second_father,ans=self.isCycle(first,second,paths)
            if ans:#如果构成环
                return [first,second]
            else:#没有构成环
                paths[second_father]=first_father

其实做这题花费了很大的精力才想到思路,[衰]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值