Leetcode 刷题笔记 图论part06

卡码网 108 冗余连接

并查集的进一步应用

father = list()
def find(u):
    if u == father[u]:
        return u
    else:
        father[u] = find(father[u])
        return father[u]
def is_same(u, v):
    u = find(u)
    v = find(v)
    return u == v
def join(u, v):
    u = find(u)
    v = find(v)
    if u != v:
        father[u] = v
if __name__ == '__main__':
    n = int(input())
    for i in range(n + 1):
        father.append(i)
    result = None
    for i in range(n):
        s, t = map(int, input().split())
        if is_same(s, t):
            result = str(s) + ' ' + str(t)
        else:
            join(s, t)
    print(result)

卡码网 109 冗余连接 ||

太难了

from collections import defaultdict
father = list()
def find(u):
    if u == father[u]:
        return u
    else:
        father[u] = find(father[u])
        return father[u]
def is_same(u, v):
    u = find(u)
    v = find(v)
    return u == v
def join(u, v):
    u = find(u)
    v = find(v)
    if u != v:
        father[u] = v
def get_remove_edge(edges):
    global father
    father = [i for i in range(n + 1)]
    for s, t in edges:
        if is_same(s, t):
            print(s, t)
            return
        else:
            join(s, t)
def is_tree_after_remove_edge(edges, edge, n):
    global father
    father = [i for i in range(n + 1)]
    for i in range(len(edges)):
        if i == edge:
            continue
        s, t = edges[i]
        if is_same(s, t):
            return False
        else:
            join(s, t)
    return True
if __name__ == '__main__':
    n = int(input())
    edges = list()
    in_degree = defaultdict(int)
    for i in range(n):
        s, t = map(int, input().split())
        in_degree[t] += 1
        edges.append([s, t])
    vec = list()
    for i in range(n - 1, -1, -1):
        if in_degree[edges[i][1]] == 2:
            vec.append(i)
    if len(vec) > 0:
        if is_tree_after_remove_edge(edges, vec[0], n):
            print(edges[vec[0]][0], edges[vec[0]][1])
        else:
            print(edges[vec[1]][0], edges[vec[1]][1])
    else:
        get_remove_edge(edges)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值