首页 > 编程语言 >代码随想录算法训练营第五十六天|KM108.冗余连接|KM109.冗余连接Ⅱ

代码随想录算法训练营第五十六天|KM108.冗余连接|KM109.冗余连接Ⅱ

时间:2025-01-07 14:04:38浏览次数:3  
标签:__ parent self 随想录 find edges root 连接 冗余

108. 冗余连接

本题光看题目没理解具体什么意思;看了题解有点明白了;(个人觉得还是力扣的题目描述比较容易理解)

题目意思:大概就是加一条边使树结构有环,然后再环中去掉一条边(如果环中多条边可取,则去掉最后一条边),仍然变成一颗树结构;

思路:观察两个节点是否再一个集合,如果不在,也可以将两个节点添加到一个集合中;

class UnionFind:
    def __init__(self, size):
        self.parent = list(range(size + 1))  # 初始化并查集

    def find(self, u):
        if self.parent[u] != u:
            self.parent[u] = self.find(self.parent[u])  # 路径压缩
        return self.parent[u]

    def union(self, u, v):
        root_u = self.find(u)
        root_v = self.find(v)
        if root_u != root_v:
            self.parent[root_v] = root_u

    def is_same(self, u, v):
        return self.find(u) == self.find(v)

def main():
    # 输入
    n = int(input())
    uf = UnionFind(n)
    # 寻找冗余边
    res = None
    for i in range(n):
        s, t = map(int, input().split())
        if uf.is_same(s, t):
            res = str(s) + ' ' + str(t)
        else:
            uf.union(s, t)
    # 输出
    print(res)

if __name__ == '__main__':
    main()

109. 冗余连接II

        本题与KM108.冗余连接类似,但本题是一个有向图,有向图相对要复杂一些;

        如果是有向树的话,只有根节点入度为0,其他节点入度都为1(因为该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点);

        所以情况一:如果我们找到入度为2的点,那么删一条指向该节点的边就行了;

        情况二: 入度为2 的一种情况下只能删特定的一条边,如下图所示;该情况只能删除这条边(节点1 -> 节点3)

        情况三: 如果没有入度为2的点,说明 图中有环了(注意是有向环),对于这种情况,删除构成环的边就可以了;

from collections import defaultdict
class UnionFind:
    def __init__(self, size):
        self.parent = list(range(size + 1))  # 初始化并查集

    def find(self, u):
        if self.parent[u] != u:
            self.parent[u] = self.find(self.parent[u])  # 路径压缩
        return self.parent[u]

    def union(self, u, v):
        root_u = self.find(u)
        root_v = self.find(v)
        if root_u != root_v:
            self.parent[root_v] = root_u

    def is_same(self, u, v):
        return self.find(u) == self.find(v)

    def is_tree_after_remove_edge(self, edges, edge, n):
        for i in range(len(edges)):
            if i == edge:
                continue
            s, t = edges[i]
            if self.is_same(s, t):  # 成環,即不是有向樹
                return False
            else:  # 將s,t放入集合中
                self.union(s, t)
        return True

    def get_remove_edge(self, edges):
        for s, t in edges:
            if self.is_same(s, t):
                print(s, t)
                return
            else:
                self.union(s, t)

def main():
    # 输入
    n = int(input())
    edges = list()
    in_degree = defaultdict(int)
    uf = UnionFind(n)
    for i in range(n):
        s,t = map(int, input().split())
        in_degree[t] += 1
        edges.append([s, t])
    # 寻找入度为2的边,并记录其下标(index)
    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 uf.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:
        # 情況三:有环
        uf.get_remove_edge(edges)

if __name__ == '__main__':
    main()

标签:__,parent,self,随想录,find,edges,root,连接,冗余
From: https://blog.csdn.net/weixin_49494409/article/details/144980143

相关文章

  • 代码随想录算法训练营第二十八天-贪心算法-122. 买卖股票的最佳时机II
    有奇妙的解法分析要获得利润,就是当天卖出前一天买入的的利润,也就是当天价格减去前一天的价格通过这样的运算,可以得到一个新的序列,这个序列就是上一道53的最大子序和的应用了而且把这些子序和中所有正数值都加到一起就是最大利润了#include<iostream>#include<vector>c......
  • Mysql连接报错排查解决记录
    Mysql连接报错排查解决记录背景: 系统:uosserver-1060e​ 运行环境kvm虚拟机​ mysql版本:5.7.44,forLinux(x86_64)问题现象:宿主机重启后,kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接,报错现象分别如下:dbeaver-ce工具连接报错:Cannotreadresp......
  • IDEA中连接redis服务器失败解决方案
    问题分析若在配置文档中redis服务器的ip地址,端口号,密码都正确情况下,IDEA还是无法连接redis服务器,可能是防火墙的问题,需要开放Redis端口解决办法(以MobaXterm为例)我们需要在MobaXterm窗口中,依次输入下列命令:1.检查系统防火墙工具sudosystemctlstatusfirewalld如......
  • 【详解】svn:Can‘tconnecttohost‘*.*.*.*‘:由于连接方在一段时间后没有正确答复或
    目录解决SVN错误:Can'tconnecttohost'...':由于连接方在一段时间后没有正确答复或连接1.检查网络连接2.防火墙和安全软件3.SVN服务器状态4.客户端配置问题5.使用SSH或其他协议6.联系技术支持示例代码代码解释注意事项1.检查网络连接2.检查防火墙设置3......
  • Linux命令行连接蓝牙设备
    Linux命令行连接蓝牙设备查看Bluetooth设备:hciconfig启动一个Bluetooth设备,例如:hci0:hciconfighci0up相关指令查看特定的Bluetooth设备(例如,设备名为hci0):hciconfighci0关闭一个Bluetooth设备(例如,设备名为hci0):hciconfighci0down修改一个Bluetooth设备的......
  • LDAPS 636端口无法连接 报服务器不在工作
     LDAPS636端口无法连接报服务器不在工作的解决办法  AD与第三方系统集成,需要用到389和636两个端口,389是普通连接,636是SSL,二者所能做的操作不同,如果两个端口都已放通,能telnet通,正常是可以直接用389连接的,但连上后只能看都一些基本的属性信息,OU及人员信息无法查看。必须使用6......
  • 代码随想录 test1(二分详解,包括二分答案)
    一、二分查找关键:确定待查找的元素出现在什么区间内,循环不变量:目标值一定在当前搜索范围内。模板一:在左闭右闭区间内查找目标元素       由于待查找元素在左闭右闭区间,因此要想在已有数组内查找该元素,就要让初始左右指针分别为0,size-1(刚好覆盖整个数组)。   ......
  • 掌握这3个Excel函数公式,遇到Excel文本连接问题!
    大家平时在用Excel表格处理数据时,有时需要对表格某些单元格中的文本进行连接组合,比如说需要把有些地址信息的省、市、区、详细地址这样的不同单元格文本连接到一块,这时候如果使用函数公式会非常方便和快捷。今天就跟大家分享3个Excel函数公式,掌握这3个Excel函数公式后,遇到Excel......
  • Navicat连接Oracle数据库报错:oracle library is not loaded解决方法.240109
    连接Oracle时提示“oraclelibraryisnotloaded”。去Oracle官网下载OracleInstantClientDownloads。https://www.oracle.com/database/technologies/instant-client/downloads.html修改OCIlibrary下载好的文件包解压到D盘,记住路径。打开NavicatPremium程序,打开“......
  • 【MySQL】九、表的内外连接
    文章目录前言Ⅰ.内连接案例:显示SMITH的名字和部门名称Ⅱ.外连接1、左外连接案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来2、右外连接案例:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来练习......