无前趋的顶点优先的拓扑排序方法

该方法的每一步总是输出当前无前趋(即人度为零)的顶点,其抽象算法可描述为: 
    NonPreFirstTopSort(G){//优先输出无前趋的顶点 
      while(G中有人度为0的顶点)do{ 
       从G中选择一个人度为0的顶点v且输出之; 
       从G中删去v及其所有出边; 
       } 
      if(输出的顶点数目<|V(G)|) 
        //若此条件不成立,则表示所有顶点均已输出,排序成功。 
        Error("G中存在有向环,排序失败!"); 
     }

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. import java.util.Stack;
  5. public class Graph {
  6. int vertexNum;   //图的顶点数
  7. ArrayList<ArrayList<Integer>>  table; //图的邻接表,table.get(i)存放与i邻接的顶点
  8. Stack<Integer> stack;  //存放入度为0的顶点
  9. int[] result;   //拓朴排序的结果
  10. int[] in;// 入度,in[i]表示顶点i的入度
  11. /**
  12. *
  13. * 构造一个图
  14. *
  15. * @param num
  16. * 图的顶点数
  17. *
  18. */
  19. public Graph(int num) {
  20. vertexNum = num;
  21. table = new ArrayList<ArrayList<Integer>> (vertexNum);
  22. ;i<vertexNum;i++)
  23. table.add(new ArrayList<Integer>());
  24. stack = new Stack<Integer>();
  25. result = new int[vertexNum];
  26. in = new int[vertexNum];
  27. }
  28. /**
  29. * 向图中添加无向边
  30. *
  31. * @param I
  32. *         边的一个顶点
  33. * @param J
  34. *         边的另一个顶点
  35. * @return 是否添加成功
  36. */
  37. public boolean addEdge(int I, int J) {
  38. /**
  39. * 判断用户输入的是否是一个顶点,如果是,则返回flase,添加不成功
  40. */
  41. if (J == I) {
  42. return false;
  43. }
  44. /**
  45. * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
  46. *
  47. */
  48. ) {
  49. /**
  50. *
  51. * 判断边是否存在
  52. */
  53. if (isEdgeExists(I, J)) {
  54. return false;
  55. }
  56. /**
  57. * 添加边,将孤头的入度加1
  58. */
  59. table.get(I).add(J);
  60. in[J]++;
  61. return true;
  62. }
  63. return false;
  64. }
  65. /**
  66. * 判断有向边是否存在
  67. *
  68. * @param i
  69. *            要查询的有向边的一个孤尾
  70. * @param j
  71. *            要查询的有向边的另一个孤头
  72. * @return 边是否存在,false:不存在,true:存在
  73. */
  74. public boolean isEdgeExists(int i, int j) {
  75. /**
  76. * 判断所输入的顶点值是否在图所顶点范围值内,如果不在,则提示顶点不存在
  77. *
  78. */
  79. ) {
  80. if (i == j) {
  81. return false;
  82. }
  83. /**
  84. * 判断i的邻接结点集是否为空
  85. */
  86. if (table.get(i) == null) {
  87. return false;
  88. }
  89. /**
  90. * 判断这条边是否存在,如果存在,则提示边已经存在
  91. */
  92. ; q < table.get(i).size(); q++) {
  93. if (((Integer) table.get(i).get(q)).intValue() == j) {
  94. System.out.println("顶点" +i+"和"+"顶点"+j+ "这两点之间存在边");
  95. return true;
  96. }
  97. }
  98. }
  99. return false;
  100. }
  101. public void TopSort() {   //无前趋的顶点优先的拓扑排序方法
  102. ; i < vertexNum; i++)   //无前趋的顶点入栈
  103. )
  104. stack.push(i);
  105. ;
  106. while (!stack.isEmpty()) {
  107. result[k] = (Integer) stack.pop();   //弹出一个无前趋的顶点,并放入拓扑排序的结果集
  108. if (table.get(result[k]) != null) {  //这个顶点的邻接表非空
  109. ; j < table.get(result[k]).size(); j++) {
  110. int temp = (Integer) table.get(result[k]).get(j);
  111. //对result[k]每一个邻接点进行入度减1操作
  112. ) { //如果temp的入度为0,进栈.
  113. stack.push(temp);
  114. }
  115. }
  116. }
  117. k++;
  118. }
  119. if (k < vertexNum) {
  120. System.out.println("有回路");
  121. );
  122. }
  123. }
  124. public int[] getResult() {
  125. return result;
  126. }
  127. }

测试: 

  1. import java.util.List;
  2. public class GraphTest {
  3. public static  void main(String args[]){
  4. );
  5. );
  6. );
  7. );
  8. );
  9. );
  10. );
  11. );
  12. );
  13. );
  14. graph.TopSort();
  15. int[] list = graph.getResult();
  16. System.out.println("拓扑排序的结果为:");
  17. for(int i : list){
  18. System.out.print(i+"        ");
  19. }
  20. }
  21. }

运行: 
C:\>java   GraphTest 
拓扑排序的结果为: 
4        2        1        3        5        0

下载源码

 

无前趋的顶点优先的拓扑排序方法(JAVA)(转载http://128kj.iteye.com/blog/1706968)的更多相关文章

  1. 有向图的拓扑排序算法JAVA实现

    一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径……并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...

  2. 算法笔记_023:拓扑排序(Java)

    目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...

  3. tsort - 拓扑排序

    tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572   (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...

  4. 有向无环图的应用—AOV网 和 拓扑排序

    有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林 ...

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

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

  6. 关于拓扑排序(topologicalsort)

    假设我们有一组任务要完成,并且有些任务要在其它任务完成之后才能开始,所以我们必须非常小心这些任务的执行顺序.如果这些任务的执行顺序足够简单的话,我们可以用链表来存储它们,这是一个很好的方案,让我们可以 ...

  7. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  8. 拓扑排序(topsort)

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

  9. hdu4324 Triangle LOVE (拓扑排序)

    这是一道最简单的拓扑排序题,好久没看这个算法了! 有点生疏了! 后附上百度的资料; #include<stdio.h> #include<string.h> int in[50 ...

随机推荐

  1. SQL慢查询安装过程

    SQL慢查询 基本操作 打开防火墙 firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload 安 ...

  2. MongoDB3.2配置文件.md

    Core Options systemLog Options systemLog: verbosity: <int> quiet: <boolean> traceAllExce ...

  3. Android--------TabLayout实现新闻客户端顶部导航栏

    APP市场中大多数新闻App都有导航菜单,导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面,今日头条, 网易新闻等. 随着版本迭代的更新, ...

  4. [POI2011]Meteors

    嘟嘟嘟 做了几道题之后,对整体二分有点感觉了. 整体二分的本质就是二分答案.所以这道题二分的就是次数. 然后就是套路了,把小于\(mid\)的操作都添加减去,然后查询,如果查询的值\(x\)比给定值大 ...

  5. django博客项目-设置django为中文语言

    找到项目级别里面的setting文件,修改如下配置 """ LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' & ...

  6. WorldWind源码剖析系列:地形访问器类TerrainAccessor

    地形访问器类TerrainAccessor 地形访问器类TerrainAccessor提供了对地形(高程)Terrain (elevation)访问的各种接口interface,是NltTerrain ...

  7. servlet3.0

    1.之前我们创建的项目是servlet2.5,之前的版本,servlet.filter.listener需要配置web.xml 在servlet3.0的时候,没有web.xml,提供注解开发. ser ...

  8. Android 一个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  9. 蓝桥杯 历届试题 网络寻路(dfs搜索合法路径计数)

    X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径 ...

  10. POJ 2367 Genealogical tree 拓扑排序入门题

    Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8003   Accepted: 5184 ...