zoukankan      html  css  js  c++  java
  • 寻找图中的有向环-java

    判断图中是否有一个有向环:

    edgeTo  数组找到有向环的所有顶点
    onStack  调用dfs时将其设置为true,调用结束时设为false。
    
    
    public class DirectedCycle {
        private boolean[] marked;        // marked[v] = has vertex v been marked?
        private int[] edgeTo;            // edgeTo[v] = previous vertex on path to v
        private boolean[] onStack;       // onStack[v] = is vertex on the stack?
        private Stack<Integer> cycle;    // directed cycle (or null if no such cycle)
    
        /**
         * Determines whether the digraph {@code G} has a directed cycle and, if so,
         * finds such a cycle.
         * @param G the digraph
         */
        public DirectedCycle(Digraph G) {
            marked  = new boolean[G.V()];
            onStack = new boolean[G.V()];
            edgeTo  = new int[G.V()];
            for (int v = 0; v < G.V(); v++)
                if (!marked[v] && cycle == null) dfs(G, v);
        }
    
        // run DFS and find a directed cycle (if one exists)
        private void dfs(Digraph G, int v) {
            onStack[v] = true;
            marked[v] = true;
            for (int w : G.adj(v)) {
    
                // short circuit if directed cycle found
                if (cycle != null) return;
    
                // found new vertex, so recur
                else if (!marked[w]) {
                    edgeTo[w] = v;
                    dfs(G, w);
                }
    
                // trace back directed cycle
                else if (onStack[w]) {
                    cycle = new Stack<Integer>();
                    for (int x = v; x != w; x = edgeTo[x]) {
                        cycle.push(x);
                    }
                    cycle.push(w);
                    cycle.push(v);
                    assert check();
                }
            }
            onStack[v] = false;
        }
    
        /**
         * Does the digraph have a directed cycle?
         * @return {@code true} if the digraph has a directed cycle, {@code false} otherwise
         */
        public boolean hasCycle() {
            return cycle != null;
        }
    
        /**
         * Returns a directed cycle if the digraph has a directed cycle, and {@code null} otherwise.
         * @return a directed cycle (as an iterable) if the digraph has a directed cycle,
         *    and {@code null} otherwise
         */
        public Iterable<Integer> cycle() {
            return cycle;
        }
    
    
        // certify that digraph has a directed cycle if it reports one
        private boolean check() {
    
            if (hasCycle()) {
                // verify cycle
                int first = -1, last = -1;
                for (int v : cycle()) {
                    if (first == -1) first = v;
                    last = v;
                }
                if (first != last) {
                    System.err.printf("cycle begins with %d and ends with %d
    ", first, last);
                    return false;
                }
            }
    
    
            return true;
        }
    
        /**
         * Unit tests the {@code DirectedCycle} data type.
         *
         * @param args the command-line arguments
         */
        public static void main(String[] args) {
            In in = new In(args[0]);
            Digraph G = new Digraph(in);
    
            DirectedCycle finder = new DirectedCycle(G);
            if (finder.hasCycle()) {
                StdOut.print("Directed cycle: ");
                for (int v : finder.cycle()) {
                    StdOut.print(v + " ");
                }
                StdOut.println();
            }
    
            else {
                StdOut.println("No directed cycle");
            }
            StdOut.println();
        }
    
    }

     有向环为3-4-5-3

  • 相关阅读:
    SaltStack入门到精通第一篇:安装SaltStack
    saltstack 基础入门文档
    【基础】centos 6.X 下修改图形界面为命令行界面(单用户救援模式)
    成都达内推荐PHP书籍【update 2017.1.10】
    高性能Mysql主从架构的复制原理及配置详解
    MySQL数据库的初始化mysql_install_db 【基础巩固】
    linux rsync配置文件参数详解
    实时跟踪log变化的工具Apachetop
    实时观察Apache访问情况的工具Apachetop
    apachetop 实时监测web服务器运行状况
  • 原文地址:https://www.cnblogs.com/hequnwang/p/14307630.html
Copyright © 2011-2022 走看看