📄 cycledetectionalgorithmdfs.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 + -