• 拓扑排序


        拓扑排序,首先它是一种排序。不过是应用在有向无环图上,将图的结点按照某种规则排成一个线性队列。只不过排序的规则是

    对于任意两个结点(u,v),如果他们之间存在边(u->v),那么u必须出现在v之前。

              满足拓扑排序的一个有向无环图

    那么按照上面的规则我们可以这样实现拓扑排序

    1: 找到所有初始入度为0的节点,并将它们放入队列或者栈中,并记录此时入度为0的数目。

    2:遍历队列中的结点,对每一个结点,遍历它的直接相连的结点。并将它们入度减一,如果入度为0,将该节点放入队列,更新入度为0的数目(+1)。

    3:重复2中操作,直到队列中元素为空,此时比较入度为0的数目和图的总结点数是否相等。如果相等,则可以满足拓扑排序(也就是判断图不存在环),反之不满足。

    import java.util.Stack;
    
    /**
     * 为了简单起见 使用了邻接矩阵
     * sort具体过程如上述所说
     */
    public class TopoSort {
        public static boolean sort(int[][] matrix, int[] degree) {
            Stack<Integer> stack = new Stack();
            int count = 0;
            for (int i = 0; i < degree.length; i++) {
                if (degree[i] == 0) {
                    stack.push(i);
                    count++;
                }
            }
            while (!stack.isEmpty()) {
                int temp = stack.pop();
                for (int i = 0; i < matrix[temp].length; i++) {
                    if (matrix[temp][i] == 1) {
                        degree[i]--;
                        if (degree[i] == 0) {
                            stack.push(i);
                            count++;
                        }
                    }
                }
            }
            return count == matrix.length;
        }
    
        public static void main(String[] args) {
            int[][] matrix = {{0, 1, 1, 0, 0},
                    {0, 0, 1, 1, 0},
                    {0, 0, 0, 1, 1},
                    {0, 0, 1, 0, 1},
                    {0, 0, 0, 0, 0}};
            int[] degree = {0, 1, 3, 2, 2};
            System.out.println(sort(matrix,degree));
        }
    }
    

      

  • 相关阅读:
    字符串匹配之朴素匹配
    XSS的攻击原理
    使用metasploit收集邮箱
    C++实现折半插入排序
    C++插入排序实现
    Java中的NIO
    Hashtable和HashMap区别(面试)
    面向对象:封装(一):构造函数;类的主方法;权限修饰符;对象的创建
    switch多分支语句
    递归和字母数字生成随机数
  • 原文地址:https://www.cnblogs.com/shaomys/p/11802650.html
Copyright © 2020-2023  润新知