题目链接: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
其实做这题花费了很大的精力才想到思路,[衰]