⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cycledetectionalgorithmdfs.java

📁 OpenJGraph是一个开源的Java库
💻 JAVA
字号:
package salvo.jesus.graph.algorithm;import salvo.jesus.graph.*;import java.util.*;/** * An implementation of CycleDetectionAlgorithm via DFS.  Although * the interface declares parameters of type Graph, only DirectedGraphs are * currently supported. * * @author John V. Sichi */public class CycleDetectionAlgorithmDFS extends CycleDetectionAlgorithm{    // TODO jvs 10-Feb-2002 -- most of these methods can be optimized    // by remembering cyclic subgraphs and cycle-free subgraphs as we see them,    // and skipping when encountered again    public CycleDetectionAlgorithmDFS(Graph graph)    {        super(graph);        if (!(graph instanceof DirectedGraph)) {            // TODO jvs 10-Feb-2002 -- support undirected graphs            throw new IllegalArgumentException(                "cycle detection in undirected graphs not yet implemented");        }    }    /**     * @see CycleDetectionAlgorithm#findCycleSubgraph(Graph)     */    public void findCycleSubgraph(Graph subgraph)        throws Exception    {        Iterator iterator = m_graph.getEdgeSet().iterator();        while (iterator.hasNext()) {            Edge e = (Edge) iterator.next();            if (detectCycles(e)) {                subgraph.addEdge(e);            }        }    }    /**     * @see CycleDetectionAlgorithm#findCycleSubgraph(Graph,Vertex)     */    public void findCycleSubgraph(Graph subgraph,Vertex v)        throws Exception    {        DirectedGraph directedGraph = (DirectedGraph) m_graph;        Iterator iterator = m_graph.getEdgeSet().iterator();        while (iterator.hasNext()) {            DirectedEdge e = (DirectedEdge) iterator.next();            if (directedGraph.isPath(e.getSink(),v)                && directedGraph.isPath(v,e.getSource()))            {                subgraph.addEdge(e);            }        }    }    /**     * @see CycleDetectionAlgorithm#findCycleSubgraph(Graph,Edge)     */    public void findCycleSubgraph(Graph subgraph,Edge e)        throws Exception    {        DirectedEdge d1 = (DirectedEdge) e;        DirectedGraph directedGraph = (DirectedGraph) m_graph;        Iterator iterator = m_graph.getEdgeSet().iterator();        while (iterator.hasNext()) {            DirectedEdge d2 = (DirectedEdge) iterator.next();            if (directedGraph.isPath(d1.getSink(),d2.getSource())                && directedGraph.isPath(d2.getSink(),d1.getSource()))            {                subgraph.addEdge(d2);            }        }    }    /**     * @see CycleDetectionAlgorithm#detectCycles()     */    public boolean detectCycles()    {        // TODO jvs 10-Feb-2002 -- this can be optimized by remembering        // portions known to be cycle-free and skipping them        Iterator vertexIter = m_graph.getVerticesIterator();        while (vertexIter.hasNext()) {            Vertex v = (Vertex) vertexIter.next();            if (detectCycles(v)) {                return true;            }        }        return false;    }    /**     * @see CycleDetectionAlgorithm#detectCycles(Vertex)     */    public boolean detectCycles(Vertex v)    {        return ((DirectedGraph) m_graph).isCycle(v);    }        /**     * @see CycleDetectionAlgorithm#detectCycles(Edge)     */    public boolean detectCycles(Edge e)    {        DirectedEdge directedEdge = (DirectedEdge) e;        return ((DirectedGraph) m_graph).isPath(            directedEdge.getSink(),directedEdge.getSource());    }}// End CycleDetectionAlgorithmDFS.java

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -