首页 > 编程语言 >代码随想录算法训练营day58| 117.软件构建 47.参加科学大会

代码随想录算法训练营day58| 117.软件构建 47.参加科学大会

时间:2024-11-26 21:36:47浏览次数:5  
标签:入度 47 源点 随想录 range 117 edges minDist 节点

学习资料:https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景

图论
拓扑排序:收集入度为0的节点,删掉该节点后其他节点的入度可能变化,记得更新,然后继续删除入度为0的点,直到没有。整个过程的顺序就对应了有向图
dijkstra算法:类似prim,也是贪心,找距离源点最近的节点,设置该节点为以访问,更新其他未访问节点到源点的最短距离

学习记录:
117.软件构建

点击查看代码
# 拓扑排序:将关系转换为有向图,线性排序(如果有环,循环依赖则不行)
# 具体思路:统计每个节点的入度和出度;如果入度为0而有入度则为根;
# 依次删除入度为0的点,记住要更新剩下节点的入度,都会-1

from collections import deque, defaultdict

def topological_sort(n, edges):
    # 构造一个记录节点入度的列表,初始设置为0
    inDegree = [0]*n
    # 记录节点间的依赖关系
    umap = defaultdict(list)  # 每个键的默认值都是空列表[]
    
    # 构建图和入度表(s有多少个下一级),s->t,则t的入度+1
    for s, t in edges:
        inDegree[t] += 1
        umap[s].append(t)
    
    # 初始化队列,加入所有入度为0的节点,再一个一个处理
    queue = deque([i for i in range(n) if inDegree[i]==0])
    result = []
    
    while queue:
        cur = queue.popleft()
        result.append(cur)   # 把第一个根加入结果中,并讨论删除这个节点后其他节点的入度变化情况
        for file in umap[cur]:
            inDegree[file] -= 1
            if inDegree[file] == 0:   # 当出现新的根,及时加入队列中
                queue.append(file)
    
    if len(result)==n:
        print(" ".join(map(str, result)))
    else:
        print(-1)


# 输入值
n, m = map(int, input().split())
edges = []
for _ in range(m):
    edges.append(list(map(int, input().split())))
topological_sort(n, edges)


47.参加科学大会(没看懂!!)

点击查看代码
# dijkstra算法,类似于prim
# 统计每个节点到源点的最小距离(minDist),和是否被访问过(visited)
# 找到距离源点最近的未访问过的节点,选中它;将它标记为访问过;更新minDist

def dijkstra(n, m, start, end):
    # 初始化邻接矩阵,每个节点到源点的距离都设置为无穷大,因为后面要保存最短距离
    grid = [[float('inf')]*(n+1) for _ in range(n+1)]
    for p1, p2, val in edges:
        grid[p1][p2] = val
    
    # 初始化距离数组,都为无穷大
    minDist = [float('inf')]*(n+1)
    minDist[start]=0  # 自己到自己的距离为0
    # 访问数组,初始为未访问
    visited = [False]*(n+1)
    
    # 遍历所有节点
    for _ in range(1, n+1):
        minVal = float('inf')
        cur = -1
        
        # 选择距离源点最近且未访问过的节点
        for v in range(1, n+1):
            if not visited[v] and minDist[v]<minVal:
                minVal = minDist[v]
                cur = v
        # 若节点都访问过,则提前结束
        if cur == -1:
            break
        # 标记该节点为被访问
        visited[cur] = True
        
        # 更新剩余未访问节点到源点的距离 ????? 真没看懂啊!!!!!
        for v in range(1, n+1):
            if not visited[v] and grid[cur][v] != float('inf') and minDist[cur]+grid[cur][v]<minDist[v]:
                minDist[v] = minDist[cur]+grid[cur][v]
    return -1 if minDist[end]==float('inf') else minDist[end]
    
# 输入值
n, m = map(int, input().split())
edges = []
for _ in range(m):
    edges.append(list(map(int, input().split())))
start = 1
end = n
result = dijkstra(n, m, start, end)
print(result)


PS:今天更冷了,多云
题看懂了一道,图论多回顾学习
今天吃了食堂的手工扯面,快半年没吃过了,好吃的!吃了鸡公煲,一如既往的好吃。
今天好困,论文接近尾声了,加油
找工作啥时候是个头啊,我只是一个爱生活的小菜鸟

标签:入度,47,源点,随想录,range,117,edges,minDist,节点
From: https://www.cnblogs.com/tristan241001/p/18571009

相关文章

  • 洛谷P1478(洛谷P1223)
    因为这两题相似,把它们放在一个博客里面发了陶陶摘苹果(升级版)-洛谷陶陶摘苹果(升级版)题目描述又是一年秋季时,陶陶家的苹果树结了n个果子。陶陶又跑去摘苹果,这次他有一个a公分的椅子。当他手够不着时,他会站到椅子上再试试。这次与NOIp2005普及组第一题不同的是:陶陶之前搬......
  • 代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大
    LeetCode150.逆波兰表达式求值题目链接:逆波兰表达式求值题目链接思路主要是要理解逆波兰表达式的定义,在理解了逆波兰表达式的定义后,使用栈就可以直接做了。逆波兰表达式是一种后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种中缀表达式,如(1+2)......
  • 代码随想录算法训练营第十天(LeetCode232.用栈实现队列;LeetCode225.用队列实现栈;LeetCo
    LeetCode232.用栈实现队列题目链接:用栈实现队列题目链接思路队列是先进先出,栈是先进后出,为了能够让栈可以模拟队列的先进先出,我们设置两个栈,一个栈作为入栈,一个栈作为出栈,我们在入栈存储完数据后,将入栈中的数据全部存储到出栈中,那么从出栈中弹出来的数据就是先进先出的......
  • 代码随想录——26、二叉(搜索)树的最近公共祖先
    递归最近公共祖先定义:设节点root为节点p,q的某公共祖先,若其左子节点root.left和右子节点root.right都不是p,q的公共祖先,则称root是“最近的公共祖先”。若root是p,q的最近公共祖先,则只可能为以下情况之一如果p和q在节点root的两侧,那么root就是最近公共祖先p......
  • CHEE 4703: Process Dynamics and Control
    CHEE4703:ProcessDynamicsandControlFall2024Lab3:RootLocusDiagramandControllerTuningProcessBackgroundConsiderablendingprocesswithtwoinletstreamsandasingle(overflow)outletstream.Theschematicdiagramoftheprocessisshownin......
  • 代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝
    学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路图论并查集prim算法kruskal算法学习记录:108.冗余连接点击查看代码#并查集解法classUnionFind:def__init__(self,size):self.parent=list(range(size+1))deffind(se......
  • 代码随想录算法训练营第十二天|二叉树理论基础|二叉树的递归遍历|二叉树的迭代遍历|二
    二叉树的理论基础二叉树的主要形式:        二叉树有两种主要的形式:满二叉树和完全二叉树;    满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。可以说深度为k,有2^k-1个节点的二叉树。       ......
  • 代码随想录之滑动窗口、螺旋矩阵、区间和、开发商土地;Java之数据结构、集合源码、File
    代码随想录滑动窗口1、如果给两个字符串s和t,判断t是否为s的子串或是否s包含t的排列,用t的长度固定滑动窗口的大小,初始化将s的前t.length()个长度的字符情况存储在int数组中,int数组的大小由字符串中字符的类型决定,最大为ascii表的长度,为128。  每次循环滑动窗口向前移一位,即lef......
  • 代码随想录:快乐数
    代码随想录:快乐数这题主要是学习一下几种set怎么用。三种set,第一种第二种都是有序的,注意这个序列和插入序列无关,只和插入元素本身有关。第三种哈希表,无序,如果只需要找元素是否出现过,用第三种刚刚好。集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效......
  • (2024最新毕设合集)基于SpringBoot的校园共享厨房信息系统-72647|可做计算机毕业设计JAV
    目 录摘要第一章 绪论1.1选题背景与意义1.2研究现状1.3论文结构与章节安排第二章系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分......