原文:http://blog.csdn.net/lanchunhui/article/details/50957608

这个代码有bug,count不知道是什么?有时间再优化

Python 数据结构与算法——拓扑排序

几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束。对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acyclic Graph,DAG,无环是一个重要条件),并将寻找其中依赖顺序的过程称为拓扑排序(topological sorting)。

很多情况下,拓扑排序问题往往会出现在一些中等复杂程度的计算系统中。这方面最典型的例子莫过于软件安装了,现在大多数操作系统都至少会有一个自动安装软件组件的系统(Ubuntu Linux 系统中的 apt-get,CentOS Linux 系统中的 RPM,Mac OS X 系统中的 brew 等),这些系统会自动检测依赖关系中缺少的部分,并下载安装它们,对于这一类工作,相关组件就必须按照一定的拓扑顺序来安装。

DAG 分析

  • (1)拓扑排序并不唯一
  • (2)不含回路的有向图(有向无环图)——一定存在拓扑排序。

归简法解 DAG

归简法求解拓扑排序,第一直觉是先移除其中一个节点(后面会说,每次移除的都是当前拓扑结构中的入度为零的点,入度为 0 的含义不依赖其他任何节点,即可发生),然后解决其余 n-1 个节点的问题。

def topsort(G):in_degrees = dict((u, 0) for u in G)for u in G:for v in  G[u]:in_degrees[v] += 1# 每一个节点的入度Q = [u for u in G if in_degrees[u] == 0]# 入度为 0 的节点S = []while Q:u = Q.pop()# 默认从最后一个移除S.append(u)for v in G[u]:count[v] -= 1# 并移除其指向if count[v] == 0:Q.append(v)return S
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

对上图而言,我们使用邻接表的dict 形式进行表示:

G = {'a':'bf','b':'cdf','c':'d','d':'ef','e':'f','f':''
}
>>> print(topsort(G))
['a', 'b', 'c', 'd', 'e', 'f']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
版权声明:本文为博主原创文章,未经博主允许不得转载。

Python DAG—归简法—拓扑排序相关推荐

  1. DAG的运用:拓扑排序(AOV),关键路径(AOE)与dp的关系

    dp在DAG中有两个运用,一个是固定终点和起点的最长路(最短路) 其中最长路的算法就是关键路径(AOE)的算法. 下面是代码 #include<cstdio> #include<al ...

  2. 【BZOJ - 3036】绿豆蛙的归宿(概率DAG图dp,拓扑排序,概率dp,期望的线性性)

    题干: 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如 ...

  3. Python 数据结构与算法——拓扑排序

    几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束.对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acy ...

  4. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  5. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  6. 大数据工作流任务调度--有向无环图(DAG)之拓扑排序

    拓扑排序(Topological Sorting) 回顾基础知识: 1.图的遍历: 图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次.注意树是一种特 ...

  7. 浅谈什么是图拓扑排序

    1 引言   在工程实践中,一个工程项目往往由若干个子项目组成.这些子项目间往往有两种关系:   (1) 先后关系,即必须在某个项完成后才能开始实施另一个子项目.   (2) 子项目间无关系,即两个子 ...

  8. 什么是拓扑排序(Topological Sorting)

    (文章引用于http://songlee24.github.io/2015/05/07/topological-sorting/) 一.什么是拓扑排序 在图论中,拓扑排序(Topological So ...

  9. 拓扑排序(Topology_Sort)

    基本思想 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序 ...

最新文章

  1. 多篇开源CVPR 2020 语义分割论文
  2. Shell中的${ }、#、##、%、%%使用范例
  3. perl基本语法--转载
  4. 移动端网页特效:左右滑动开关
  5. JDK库rt包中常用包说明
  6. mysql5.7设置SQL Mode
  7. 用Python生成随机的中文验证码图片
  8. 模块XX.dll已加载,但对DllRegisterServer的调用失败
  9. C++中operator的主要用法
  10. 树莓派做一个dns缓存
  11. java异步判断数据库是否有重复字段值
  12. #Linux学习笔记# Linux系统查看文件内容的命令
  13. centos 6 编译emacs-24.5
  14. 华南主板超频设置图解_支持XMP2.0,3000稳超3733MHz,威刚龙耀D60G超频体验
  15. 华为手机html乱码,华为手机系统语言变成乱码了怎么办?
  16. Vue单页面与多页面的区别
  17. 2021牛客暑期多校训练营5 Cheating and Stealing
  18. js截取url问号前面_JS获取URL中问号后面参数值
  19. Flutter 调用百度地图APP实现位置搜索、路线规划
  20. 复杂交通流对混合交通的影响研究多向车流量分析

热门文章

  1. 普通话书籍计算机辅助,计算机辅助普通话水平测试指南
  2. 兰州市职称计算机考试地点,兰州2013年职称计算机考试报名等事项的通知
  3. mysql 5.6 emoji_让MySQL支持Emoji表情 mysql 5.6
  4. java编译POSTGRESQL_Java连接PostgreSQL数据库(安装环境 + 简易测试代码)
  5. 两个音轨合并_webm格式视频文件合并+weba音频文件无损合并
  6. fmt打印不显示 go_golang打印输出fmt和log
  7. 程序控制发送文件到邮箱_Intouch邮件发送的真实案例(一),不可多得的技术尝试...
  8. go语言csv包_golang 写入 csv 文件
  9. oracle查询表占用空,查询dba_tables 为啥有的表的表空间为空
  10. 这是最新的人工发射wifi信号技术吗?