当前位置: 首页 > article >正文

代码随想录算法训练营第58天|拓扑排序精讲、dijkstra(朴素版)精讲

打卡Day58

  • 1.拓扑排序精讲
  • 2.dijkstra(朴素版)精讲

1.拓扑排序精讲

题目链接:拓扑排序精讲
文档讲解: 代码随想录

给出一个有向图,把这个有向图转成线性的排序就叫拓扑排序。拓扑排序要检测这个有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。所以拓扑排序是图论中判断有向无环图的常用方法。拓扑排序的过程,有两步,第一步,找到入度为0的节点,加入结果集;第二步,将该节点从图中移除。 循环以上两步,直到所有节点都在图中被移除了。结果集的顺序,就是想要的拓扑排序顺序。

from collections import deque,defaultdict
def topological_sort(n,edges):
    #统计入度
    indegree = [0] * (n)
    #记录依赖关系
    umap = defaultdict(list)
    for s,t in edges:
        indegree[t] += 1 
        umap[s].append(t)
    #初始化队列,加入所有入度为0的点
    que = deque([i for i in range(n) if indegree[i] == 0])
    res = [] 
    while que:
        cur = que.popleft()
        res.append(cur)
        for file in umap[cur]:
            #获取该文件指向的文件
            indegree[file] -= 1 
            if indegree[file] == 0:
                que.append(file)
    if len(res) == n:
        print(' '.join(map(str,res)))
    else:
        print(-1)
if __name__ == '__main__':
    n,m = map(int,input().split())
    edges = [] 
    for _ in range(m):
        edges.append(list(map(int,input().split())))
    topological_sort(n,edges)

2.dijkstra(朴素版)精讲

题目链接:dijkstra(朴素版)精讲
文档讲解: 代码随想录
这道题是求最短路,最短路是图论中的经典问题,给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。在dijkstra算法中,同样有一个数组很重要,起名为:minDist。minDist数组用来每个节点距离源点的最小距离。dijkstra算法的两个注意点:可以同时求起点到所有节点的最短路径;权值不能是负数。

def dijkstra(n,edges,start,end):
    #初始化邻接矩阵
    grid = [[float('inf')] * (n+1) for _ in range(n+1)]
    for s,e,v in edges:
        grid[s][e] = v 
    #初始化距离数组和访问数组
    minDist = [float('inf')] * (n+1)
    visited = [False] * (n+1)
    minDist[start] = 0 
    for _ in range(1,n+1):
        minval = float('inf')
        cur = -1 
        #选择距离源点最近且未访问的节点
        for j in range(1,n+1):
            if not visited[j] and minDist[j] < minval:
                minval = minDist[j]
                cur = j 
        if cur == -1:
            break 
        visited[cur] = True 
        #更新minDist数组
        for j in range(1,n+1):
            if not visited[j] and grid[cur][j] != float('inf') and minDist[cur] + grid[cur][j] < minDist[j]:
                minDist[j] = minDist[cur] + grid[cur][j]
    if minDist[end] == float('inf'):
        return -1 
    else:
        return minDist[end]
if __name__ == "__main__":
    n,m = map(int,input().split())
    edges = [] 
    for _ in range(m):
        edges.append(list(map(int,input().split())))
    res = dijkstra(n,edges,1,n)
    print(res)

dijkstra算法与prim算法唯一区别在于更新minDist数组。prim算法是求非访问节点到最小生成树的最小距离,而dijkstra算法是求非访问节点到源点的最小距离。


http://www.kler.cn/a/281893.html

相关文章:

  • STM32 ADC --- 任意单通道采样
  • Acme PHP - Let‘s Encrypt
  • 近几年新笔记本重装系统方法及一些注意事项
  • 基于单片机智能温室大棚监测系统
  • MySQL中将一个字符串字段按层级树状展开
  • 基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型
  • docker内安装miniconda
  • (十六)Flink 状态管理
  • [论文笔记] eval-big-refactor lm_eval 每两个任务使用一个gpu,并保证端口未被使用
  • 网络爬虫--生成假数据
  • uniapp icons图标不显示的问题解决
  • Python爬虫(一文通)
  • Leetcode 131.分割回文串 回溯 C++实现
  • 淘宝扭蛋机小程序,市场发展下的潜在机遇
  • Vue(三)内置指令v-text、html、cloak、once、pre;自定义指令的三种方式、Vue生命周期
  • 如何切换当前使用的IP代理协议
  • 【网络安全】服务基础第一阶段——第二节:Windows系统管理基础----虚拟化IP地址以及用户与组管理
  • 一起搭WPF之列表界面设计
  • [每日一练]查询结果的质量和占比(布尔值的灵活使用)
  • 猫咪掉毛如何清理?希喂、范罗士宠物空气净化器性能比拼
  • 嵌入式UI开发-lvgl+wsl2+vscode系列:11、SSD202移植运行评估demo程序
  • vue ref和reactive区别
  • 在发布您的插件之前,如何在 ONLYOFFICE 插件市场中进行测试?
  • 如何在Java爬虫中设置代理IP:详解与技巧
  • python使用多进程multiprocessing
  • Python运行时环境