数据结构与算法

拓扑排序

2019-12-29  本文已影响0人  暮想sun

AOV网

在一个标识工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网。

拓扑序列

设G(V,E)是一个具有n个顶点的有向图,V中顶点序列v1,v2,v3....vn满足从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前,则我们成这样的顶点序列为一个拓扑序列。

拓扑排序

对一个有向图构建拓扑序列的过程。
基本思想:从AOV网中选择一个入度为0的顶点输出,然后删除这个顶点,并删除以此顶点为尾的弧,继续重复此步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止。


    private static class EdgeNode {

        //邻接点域,存储该顶点对应的下标
        private int adjvex;

        //下一领节点
        private EdgeNode edgeNode;

        public EdgeNode(int adjvex) {
            this.adjvex = adjvex;
        }

        public EdgeNode(int adjvex, EdgeNode edgeNode) {
            this.adjvex = adjvex;
            this.edgeNode = edgeNode;
        }
    }

    private static class VertexNode {
        //顶点入度
        private int in;

        //顶点信息
        private Object data;

        //边信息
        private EdgeNode firstedge;

        public VertexNode(int in, Object data) {
            this.in = in;
            this.data = data;
        }

        public VertexNode(Object data) {
            this.data = data;
        }

        public VertexNode(int in, Object data, EdgeNode firstedge) {
            this.in = in;
            this.data = data;
            this.firstedge = firstedge;
        }
    }

    /**
     * 使用邻接矩阵来进行拓扑排序算法
     *
     * 将入度为0的顶点入栈
     *
     * 栈不空,则弹出,再将相连的顶点入度减一
     *
     *
     *
     * @param vertexNodes
     */
    public static void topologicalSort(VertexNode[] vertexNodes) {
        int size = vertexNodes.length;
        Stack<Integer> stack = new Stack<>();
        //将入度为0的顶点入栈
        for (int i = 0; i < size; i++) {
            if (vertexNodes[i].in == 0) {
                stack.push(i);
            }
        }

        //记录出栈个数
        int count = 0;
        while (!stack.isEmpty()) {

            int index = stack.pop();

            count++;

            System.out.print(vertexNodes[index].data + "     ");
            //将连接边的顶点入度-1,如果是零的话,压入栈
            for (EdgeNode x = vertexNodes[index].firstedge; x != null; x = x.edgeNode) {
                if (--vertexNodes[x.adjvex].in == 0) {
                    stack.push(x.adjvex);
                }

            }

        }

        if (count < size) {
            throw new RuntimeException("图存在回路");
        }
    }
上一篇下一篇

猜你喜欢

热点阅读