代码随想录算法训练营DAY62|108.冗余连接、109.冗余连接II

108.冗余连接

def init():
    for i in range(n):
        father[i]=i

def find(x):
    return x if x==father[x] else find(father[x])

def join(x,y):
    x = find(x)
    y = find(y)
    if x==y: return
    father[x]=y

def isSame(x,y):
    x = find(x)
    y = find(y)
    return True if x==y else False

if __name__=='__main__':
    n = int(input())
    
    father = [0]*n
    init()
    for _ in range(n):
        x,y = map(int,input().split())
        if isSame(x-1,y-1):
            print('{} {}'.format(str(x),str(y)))
        else:
            join(x-1,y-1)

109.冗余连接II

def init():
    for i in range(n):
        father[i]=i

def find(x):
    return x if x==father[x] else find(father[x])

def join(x,y):
    x = find(x)
    y = find(y)
    if x==y: return
    father[y]=x

def isSame(x,y):
    x = find(x)
    y = find(y)
    return True if x==y else False
    
def isTree(edges, deleteidx):
    init()
    for i in range(n):
        if i == deleteidx:
            continue
        if isSame(edges[i][0]-1,edges[i][1]-1):
            return False
        join(edges[i][0]-1, edges[i][1]-1)

    return True
    
def getremoveedge(edges):
    init()
    for i in range(n):
        if isSame(edges[i][0]-1,edges[i][1]-1):
            print(('{} {}').format(str(edges[i][0]),str(edges[i][1])))
        else:
            join(edges[i][0]-1, edges[i][1]-1)

if __name__=='__main__':
    n = int(input())
    
    father = [0]*n
    init()
    edges = []
    indegrees = [0]*n
    
    for _ in range(n):
        x,y = map(int,input().split())
        indegrees[y-1]+=1
        edges.append([x,y])
    
    vec = []    
    for i in range(n-1, -1, -1):
        if indegrees[edges[i][1]-1]==2:
            vec.append(i)
    
    if vec:
        if isTree(edges,vec[0]):
            print(('{} {}').format(str(edges[vec[0]][0]),str(edges[vec[0]][1])))
        else:
            print(('{} {}').format(str(edges[vec[1]][0]),str(edges[vec[1]][1])))
    else:
        getremoveedge(edges)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值