拓扑排序-java实现

来源:互联网 发布:程序员教程(第4版) 编辑:程序博客网 时间:2024/06/15 22:33

  1. /**
  2. * 拓扑排序:处理对象是有向图,使用的存储结构为邻接表-》每次运行的是入度为0的顶点-》使用栈进行存储
  3. *
  4. * @author timmy1
  5. *
  6. */
  7. public class TopologicalSort {
  8. // 邻接表的邻接节点
  9. class AdjoinNode {
  10. int in;
  11. String data;
  12. EdgeNode firstEdge;// 第一个边节点
  13. public AdjoinNode(int in, String data) {
  14. super();
  15. this.in = in;
  16. this.data = data;
  17. }
  18. }
  19. // 边的节点
  20. class EdgeNode {
  21. int nodeNum;// 节点的下标
  22. EdgeNode next;// 下一个边节点
  23. public EdgeNode(int nodeNum) {
  24. this.nodeNum = nodeNum;
  25. }
  26. }
  27. private AdjoinNode[] adjoins;
  28. private int size;
  29. /**
  30. * 拓扑排序:使用栈来存储入度为零的邻接节点,然后出栈,出栈后获取到后面的边节点,边节点的入度都减去一
  31. */
  32. private void topoSort() {
  33. Stack<Integer> stack = new Stack<>();// 操作的数据为顶点的下标
  34. for (int i = 0; i < size; i++) {
  35. if (adjoins[i].in == 0) {
  36. stack.push(i);
  37. }
  38. }
  39. while (!stack.isEmpty()) {
  40. // 出栈-->获取到邻接节点的下标-》获取后面的边节点-》拿到边节点的下标-》度减1
  41. int num = stack.pop();
  42. PrintUtil.print("到达顶点" + num);
  43. for (EdgeNode edgeNode = adjoins[num].firstEdge; edgeNode != null; edgeNode = edgeNode.next) {
  44. int nodeNum = edgeNode.nodeNum;// 顶点下标
  45. int in = --adjoins[nodeNum].in;// 顶点下标的入度
  46. if (in == 0) {
  47. stack.push(nodeNum);
  48. }
  49. }
  50. }
  51. }
  52. /**
  53. * 创建图的邻接表结构
  54. *
  55. * @param i
  56. */
  57. private void createGraphLinked(int num) {
  58. size = num;
  59. adjoins = new AdjoinNode[num];
  60. AdjoinNode adjoin0 = new AdjoinNode(0, "v0");
  61. AdjoinNode adjoin1 = new AdjoinNode(0, "v1");
  62. AdjoinNode adjoin2 = new AdjoinNode(2, "v2");
  63. AdjoinNode adjoin3 = new AdjoinNode(0, "v3");
  64. AdjoinNode adjoin4 = new AdjoinNode(2, "v4");
  65. AdjoinNode adjoin5 = new AdjoinNode(3, "v5");
  66. AdjoinNode adjoin6 = new AdjoinNode(1, "v6");
  67. AdjoinNode adjoin7 = new AdjoinNode(2, "v7");
  68. AdjoinNode adjoin8 = new AdjoinNode(2, "v8");
  69. AdjoinNode adjoin9 = new AdjoinNode(1, "v9");
  70. AdjoinNode adjoin10 = new AdjoinNode(1, "v10");
  71. AdjoinNode adjoin11 = new AdjoinNode(2, "v11");
  72. AdjoinNode adjoin12 = new AdjoinNode(1, "v12");
  73. AdjoinNode adjoin13 = new AdjoinNode(2, "v13");
  74. adjoins[0] = adjoin0;
  75. adjoins[1] = adjoin1;
  76. adjoins[2] = adjoin2;
  77. adjoins[3] = adjoin3;
  78. adjoins[4] = adjoin4;
  79. adjoins[5] = adjoin5;
  80. adjoins[6] = adjoin6;
  81. adjoins[7] = adjoin7;
  82. adjoins[8] = adjoin8;
  83. adjoins[9] = adjoin9;
  84. adjoins[10] = adjoin10;
  85. adjoins[11] = adjoin11;
  86. adjoins[12] = adjoin12;
  87. adjoins[13] = adjoin13;
  88. adjoin0.firstEdge = new EdgeNode(11);
  89. adjoin0.firstEdge.next = new EdgeNode(5);
  90. adjoin0.firstEdge.next.next = new EdgeNode(4);
  91. adjoin1.firstEdge = new EdgeNode(8);
  92. adjoin1.firstEdge.next = new EdgeNode(4);
  93. adjoin1.firstEdge.next.next = new EdgeNode(2);
  94. adjoin2.firstEdge = new EdgeNode(9);
  95. adjoin2.firstEdge.next = new EdgeNode(6);
  96. adjoin2.firstEdge.next.next = new EdgeNode(5);
  97. adjoin3.firstEdge = new EdgeNode(13);
  98. adjoin3.firstEdge.next = new EdgeNode(2);
  99. adjoin4.firstEdge = new EdgeNode(7);
  100. adjoin5.firstEdge = new EdgeNode(12);
  101. adjoin5.firstEdge.next = new EdgeNode(8);
  102. adjoin6.firstEdge = new EdgeNode(5);
  103. adjoin8.firstEdge = new EdgeNode(7);
  104. adjoin9.firstEdge = new EdgeNode(11);
  105. adjoin9.firstEdge.next = new EdgeNode(10);
  106. adjoin10.firstEdge = new EdgeNode(13);
  107. adjoin12.firstEdge = new EdgeNode(9);
  108. }
  109. public static void main(String[] args) {
  110. TopologicalSort topologicalSort = new TopologicalSort();
  111. topologicalSort.createGraphLinked(14);
  112. topologicalSort.topoSort();
  113. }
  114. }


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 头晕恶心想吐四肢无力怎么办 烧退了浑身疼怎么办 下午睡久了头疼怎么办 一天睡久了头疼怎么办 在家躺久了头疼怎么办 4周多儿童睡眠差怎么办 6岁儿童睡眠差怎么办 四年级的孩子不会写作文怎么办 四年级的孩子写不出作文怎么办? 欠了三万网贷怎么办 打完篮球浑身疼怎么办 在部队当兵意外死亡了怎么办 派派没有体力瓶怎么办 e记账登录不上怎么办 洁净净化区湿度高怎么办 政府测量土地少算了面积怎么办 北京武警欠我钱怎么办 被小混混打了怎么办 农保地建房子怎么办 WOW7.3到8.0橙装怎么办 90后离婚有孩子怎么办 90后的我们该怎么办 越南和中国结婚怎么办结婚证 改革怎么看走留怎么办事业怎么干 改革怎么看走留怎么办工作怎么干 军改怎么看我该怎么办 改革怎么办我该怎么干 改革怎么看 走留怎么办 腿又粗又弯怎么办 假发发量太多了怎么办 剃了发际线后悔怎么办 在外面遇到坏人抢劫怎么办 请事假单位不批怎么办 捷普请假不批怎么办 钉钉请假不审批怎么办 钉钉请假未审批怎么办 员工事假+工作履责怎么办 员工请事假不批怎么办 哺乳起员工一直请事假怎么办 请公休公司不批怎么办 辞职信交了不批怎么办