拓扑排序-java实现

  
  
  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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值