首页 > 编程语言 >代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝

代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝

时间:2024-11-25 20:34:38浏览次数:15  
标签:val self 随想录 find range edges def 连接 冗余

学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路

图论
并查集
prim算法
kruskal算法

学习记录:
108.冗余连接

点击查看代码
# 并查集解法
class UnionFind:
    def __init__(self, size):
        self.parent = list(range(size+1))
    def find(self, u):
        if u == self.parent[u]:
            return u
        else:
            self.parent[u] = self.find(self.parent[u])
            return self.parent[u]
            
    def join(self, u, v):
        """将v->u这条边加入并查集"""
        u = self.find(u)
        v = self.find(v)
        if u != v:
            self.parent[v] = u
            
    def isSame(self, u, v):
        u = self.find(u)
        v = self.find(v)
        return u == v



# 实时更新冗余边,如果有多条,那就保留最后一个,也就是最新款
result = None
# 输入值
n = int(input())
# 调用类
uf = UnionFind(n)
# 继续输入剩余信息
for i in range(n):
    s, t = map(int, input().split())
    # 判断s和t是否同根
    if uf.isSame(s, t):
        result = str(s) + ' ' + str(t)+'\t'
    else:
        uf.join(s, t)
# 输出多余边的结果
print(result)
    

109.冗余连接2(三种情况;关注入度为2的节点)

点击查看代码
class UnionFind():
    def __init__(self, size):
        self.parent = list(range(size + 1))
        
    def find(self, u):
        if u == self.parent[u]:
            return u
        self.parent[u] = self.find(self.parent[u])
        return self.parent[u]
    
    def join(self, u, v):
        u = self.find(u)
        v = self.find(v)
        if u != v:
            self.parent[u] = v
            
    def isSame(self, u, v):
        return self.find(u) == self.find(v)
    
    def is_tree_after_remove_edge(self, edges, edge, n):
        # 创建一个新的 UnionFind 实例以避免状态污染
        temp_uf = UnionFind(n)
        for i in range(len(edges)):
            if i == edge:
                continue
            s, t = edges[i]
            if temp_uf.isSame(s, t):
                return False  # 存在环
            temp_uf.join(s, t)
        return True

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


# 输入值
n = int(input())
uf = UnionFind(n)
edges = []
indegree = {}

# 输入边的信息并统计入度
for _ in range(n):
    s, t = map(int, input().split())
    indegree[t] = indegree.get(t, 0) + 1
    edges.append([s, t])

# 找入度为2的节点,记录下标
vec = []
for i in range(n - 1, -1, -1):
    if indegree[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)

53.寻宝(两种方法)

点击查看代码
# kruskal算法:关注边的算法。找到最短的边,如果对应的这条边的两个节点不在同一个集合,就把边加入生成树,把两个节点加入同一个集合
class Edge:
    def __init__(self, l, r, val):
        # 边的左节点和右节点和权值
        self.l = l
        self.r = r
        self.val = val

n = 10001
father = list(range(n))
def init():
    global father
    father = list(range(n))

def find(u):
    if u!=father[u]:
        father[u] = find(father[u])
    return father[u]
def join(u, v):
    u = find(u)
    v = find(v)
    if u!=v:
        father[v] = u
def kruskal(v, edges):
    edges.sort(key=lambda edge: edge.val)
    init()
    result_val = 0
    for edge in edges:
        x = find(edge.l)
        y = find(edge.r)
        if x!=y:
            result_val += edge.val
            join(x, y)
    return result_val

if __name__ == "__main__":
    # 输入值
    v, e = map(int, input().split())
    edges = []
    for _ in range(e):
        v1, v2, val = map(int, input().split())
        edges.append(Edge(v1, v2, val))
    result_val = kruskal(v, edges)
    print(result_val)
    
    

# # grim法:关注节点。三大步,选中距离生成树最近的节点;将该节点加入生成树;更新其余非生成树节点到生成树的最小距离
# # 输入值
# v, e = map(int, input().split())
# # 把剩余地图信息加入邻接矩阵,每个节点都初始化为10001,输入值用于存储两边的权值
# grid = [[10001] *(v+1) for _ in range(v+1)]
# for _ in range(e):
#     x, y, w = map(int, input().split())
#     # 点1到点2和点2到点1的距离一样,双向
#     grid[x][y] = w
#     grid[y][x] = w
    
# # 定义一个数组,用于保存该节点是否加入生成树中
# visited = [False]*(v+1)
# # 定义一个数组用于记录每个点距离生成树的最近距离,初始设置为10001
# minDist = [10001] * (v+1)

# # 按题目要求n个点,只需要n-1条边
# for _ in range(1, v+1):
#     min_val = 10002
#     cur = -1
#     for j in range(1, v+1):
#         if visited[j]==False and minDist[j] < min_val:
#             cur = j
#             min_val = minDist[j]
#     visited[cur] = True
#     for j in range(1, v+1):
#         if visited[j]==False and minDist[j]>grid[cur][j]:
#             minDist[j]=grid[cur][j]
# ans = 0
# for i in range(2, v+1):
#     ans += minDist[i]
# print(ans)

PS:今天好冷,阴转多云。拖了两天的内容,赶紧补上,好累,根本看不懂,不想看,都是抄的,下次回来再学
周末吃了黄焖鸡、圆子汤,今天吃了羊肉汤。
好不爽好烦!!!!平等的讨厌每个人!!!!第一次这么讨厌周日!!!! 烦死了
其实还是很伤心,怀念哥哥的一天
倒计时一周

标签:val,self,随想录,find,range,edges,def,连接,冗余
From: https://www.cnblogs.com/tristan241001/p/18568554

相关文章

  • 代码随想录算法训练营第十二天|二叉树理论基础|二叉树的递归遍历|二叉树的迭代遍历|二
    二叉树的理论基础二叉树的主要形式:        二叉树有两种主要的形式:满二叉树和完全二叉树;    满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。可以说深度为k,有2^k-1个节点的二叉树。       ......
  • GaussDB数据库SQL系列-表连接(JOIN)
    一、前言SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。二、GaussDBJOINGaussDB是华为推出的企业级分布式关系型数据库。GaussDBJOIN子句是基于两个或者多个表......
  • JDBC连接GaussDB云数据库操作示例
    ​目录一、实验环境二、登录华为云创建测试库表1、登录GaussDB云数据库2、建库、建表,用于测试3、新增普通角色(用户)用于登录及访问测试(可选)4、获取对应的公网IP三、创建java工程1、创建java工程2、添加jar包3、编辑Java代码四、执行并查看测试结果一、实验环境1、本......
  • 如何通过DAS连接GaussDB
    @目录1实验介绍2实验目的3配置DAS服务4SQL使用入门1实验介绍本实验主要描述如何通过华为云数据管理服务(DataAdminService,简称DAS)来连接华为云GaussDB数据库实例,DAS是一款专业的简化数据库管理工具,提供优质的可视化操作界面,大幅提高工作效率,让数据管理变得既安全又简......
  • 通过公网连接GaussDB数据库实例
    @目录1.通过公网连接GaussDB1.1实验介绍1.1.1关于本实验1.1.2实验目的1.2购买GaussDB数据库(可选)1.3公网IP绑定1.3.1购买弹性公网IP1.3.2绑定GaussDB数据库2附录一:安装和配置JDK2.1下载并安装JDK2.2配置JDK环境变量本实验概览图1.通过公网连接GaussDB1.1实验介绍......
  • 通过公网连接GaussDB数据库实例
    @目录1.通过公网连接GaussDB1.1实验介绍1.1.1关于本实验1.1.2实验目的1.2购买GaussDB数据库(可选)1.3公网IP绑定1.3.1购买弹性公网IP1.3.2绑定GaussDB数据库2附录一:安装和配置JDK2.1下载并安装JDK2.2配置JDK环境变量本实验概览图1.通过公网连接GaussDB1.1实验介绍......
  • 如何通过DAS连接GaussDB
    @目录1实验介绍2实验目的3配置DAS服务4SQL使用入门1实验介绍本实验主要描述如何通过华为云数据管理服务(DataAdminService,简称DAS)来连接华为云GaussDB数据库实例,DAS是一款专业的简化数据库管理工具,提供优质的可视化操作界面,大幅提高工作效率,让数据管理变得既安全又简......
  • 【昌哥IT课堂】MySQL8.0新特性之特权连接
    概述:ERROR1040(HY000):Toomanyconnections上面这个报错,开发或DBA一般都遇见过。那么碰到这个问题,我们应该怎么办呢?在MySQL5.7及之前版本,出现“toomany connection”报错,超级用户root也无法登录上去,除了重启实例,没有其他更好的解决办法;到了MySQL8.0之后的版本中,对连......
  • CodeIgniter如何手动将模型连接到数据库
    在CodeIgniter中,模型通常是自动与数据库连接的,因为模型类(CI_Model)已经内置了对数据库操作的支持。但是,如果你需要手动指定数据库连接或者进行一些特殊的数据库配置,你可以通过几种方式来实现。1.使用默认的数据库连接默认情况下,CodeIgniter的模型会使用在application/config/......
  • 代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File
    代码随想录滑动窗口1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。  每次循环滑动窗口向前移一位,即lef......