1.有向无环图和拓扑排序

有向无环图(Directed Acyclic Graph,简称DAG);拓扑排序指的对DAG一个有序的线性排列。即每次选出一个没有入度的节点,然后输出该点并将节点和其相关连的弧都删除(此时均为以该节点为弧头的弧),依次进行,直至遍历所有节点,就是一个DAG的拓扑排序,值得一提的是一个图的拓扑排序不一定是唯一的,很有可能有若干个排序。不过这样仍然不太清楚,我们以图来展示。

                                        

                                                     

                                                      

                                                                                                       

上述过程即为一个拓扑排序,首先对于该DAG来说,只有A和E是无入度的节点,任选一个E删除,接着删除相应的弧。【输出E】

同样此时只有A变成无入度节点,做同样的操作。【输出A】

删除A后只有顶点C和G没有前驱,仍然任选一个删除,依此类推,可以得到一个该图的拓扑排序。EAGCFB

2.拓扑排序的实现
前面深搜广搜已经用邻接矩阵实现无向图了,这里我们使用邻接表来表示有向图。先来复习一下邻接表

对于这样的数据结构应该怎么实现呢?如果你第一眼看上去觉得这就是若干个链表组成的,那么恭喜你回答正确,我们一般都是使用链表的思想来实现邻接表的。因此我们首先要在域中定义一个链表的数组:

  1. private Ljtable [] vertex;

然后定义链表和节点类

  1. class Ljtable {
  2. char data;
  3. Node head;
  4.  
  5. public Ljtable(char c,int n)
  6. {
  7. data = c;
  8. head = new Node(n);
  9. }
  10. }
  11.  
  12. class Node {
  13. int number;
  14. Node next;
  15. public Node(int a)
  16. {
  17. number = a;
  18. next = null;
  19.  
  20. }
  21. }

拓扑排序,纯本人手写,因为我的代码会使各节点的入度发生变化,因此需要提前存储,拓扑排序后在复原,看起来有点蠢。不过由于都是顺序排列,所以时间复杂度还好。

  1. public void Topo()
  2. {
  3. int [] m = new int [vertex.length];
  4. for (int i = 0; i < vertex.length; i++)
  5. {
  6. m[i] = vertex[i].inDegree;
  7. }
  8.  
  9. int k = 0;
  10. while(k < vertex.length)
  11. for (Ljtable l:vertex)
  12. {
  13. if(l.inDegree == 0) {
  14. System.out.print(l.data);
  15. k++;
  16. Node h = l.head;
  17. while(h!=null) {
  18. vertex[h.number].inDegree--;
  19. h = h.next;
  20. }
  21. }
  22.  
  23. }
  24.  
  25. for (int i = 0; i < vertex.length; i++)
  26. {
  27. vertex[i].inDegree = m[i];
  28. }
  29.  
  30. }

完整代码请看这里

DAG及拓扑排序的更多相关文章

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

    点击上方蓝字关注DolphinScheduler(海豚调度) |作者:代立冬 |编辑:闫利帅 回顾基础知识: 图的遍历 图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点 ...

  2. CF-721C DAG图拓扑排序+费用DP

    比赛的时候写了个记忆化搜索,超时了. 后来学习了一下,这种题目应该用拓扑排序+DP来做. dp[][]保存走到[第i个节点][走过j个点]时所用的最短时间. pre[][]用前驱节点求路径 然后遍历一 ...

  3. 拓扑排序(topsort)

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法解的唯一性问题 Kahn算法 基于DFS的算法 实际例子 取材自以下材料: http://e ...

  4. [ACM] hdu 1285 确定比赛 (拓扑排序)

    确定比赛 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. 关于最小生成树,拓扑排序、强连通分量、割点、2-SAT的一点笔记

    关于最小生成树,拓扑排序.强连通分量.割点.2-SAT的一点笔记 前言:近期在复习这些东西,就xjb写一点吧.当然以前也写过,但这次偏重不太一样 MST 最小瓶颈路:u到v最大权值最小的路径.在最小生 ...

  6. POJ2762 Going from u to v or from v to u? 强连通分量缩点+拓扑排序

    题目链接:https://vjudge.net/contest/295959#problem/I 或者 http://poj.org/problem?id=2762 题意:输入多组样例,输入n个点和m ...

  7. POJ1094——拓扑排序和它的唯一性

    比较模板的topological-sort题,关键在于每个元素都严格存在唯一的大小关系,而一般的拓扑排序只给出一个可能解,这就需要每趟排序的过程中监视它是不是总坚持一条唯一的路径. 算法导论里面的拓扑 ...

  8. 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)

    洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...

  9. 拓扑排序 Topological Sort

    2018-05-02 16:26:07 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中都在v前.例如,图形的顶点可以表示要执行的任 ...

随机推荐

  1. IDEA注释模板

    (1)Getter和Setter 生成代码的同时注释 添加新模板 输入模板生产代码: 其实就是InteliJ Default默认模板上面我们添加了生产注释,Getter的生成代码就是默认模板的. Ge ...

  2. C++.控制台_界面颜色

    1.c++中system(_color )怎样用?-CSDN论坛.html(https://bbs.csdn.net/topics/390758320) 2. 2.1. 颜色属性由两个十六进制数字指定 ...

  3. CentOS 7.5在线安装Docker 18.09.3

    1.安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 2.安装docker yum-config-manager -- ...

  4. JavaSE基础(八)--Java 循环结构

    Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...

  5. Java集合框架概述和集合的遍历

    第三阶段 JAVA常见对象的学习 集合框架概述和集合的遍历 (一) 集合框架的概述 (1) 集合的由来 如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序. 通常,程序 ...

  6. 盒模型中padding、border、margin的区别

    在CSS中,规定了一种基本设计模型——盒模型(也叫框模型),如图所示: 其中包含了四部分内容:element/元素(即图中文字).padding/内边框(图中两个红色边框之间白色部分).border/ ...

  7. css 颜色自动变化 炫彩

    .layui-icon-login-qq:hover{ color:rgb(0, 156, 255); transition: 0.5s; animation:change 10s linear 0s ...

  8. BurpSuite 爆破网页后台登陆

    由于 Burp Suite是由Java语言编写而成,所以你需要首先安装JAVA的运行环境,而Java自身的跨平台性,使得软件几乎可以在任何平台上使用.Burp Suite不像其他的自动化测试工具,它需 ...

  9. Go入门所踩过的坑:cannot find package "" in any of

    问题:cannot find package "" in any of.现已按照博客解决,分享一种自己踩得坑欢迎大神指导交流! 首先使用go env查看当前环境变量,新手入门出现找 ...

  10. hdu 6045 多校签到题目

    http://acm.hdu.edu.cn/showproblem.php?pid=6045 题解:遍历一遍,求出两个人答案中相同的个数,用wa表示.然后我从大的数入手,当wa的数都尽可能在两个人答案 ...