package org.seqcode.gseutils.graphs; import java.util.*; public class UndirectedCycleChecker implements CycleChecker { private UndirectedAlgorithms algs; private UndirectedGraph graph; private Map<String,Set<String>> connected; private GraphSearch searcher; private boolean cyclic; public UndirectedCycleChecker(UndirectedGraph ug) { graph = ug; searcher = new GraphSearch(graph); algs = new UndirectedAlgorithms(graph); connected = new HashMap<String,Set<String>>(); rebuild(); } public boolean checkCycleWithEdge(String v1, String v2) { return connected.get(v2).contains(v1) || containsCycle(); } public boolean containsCycle() { return cyclic; } public void rebuild() { connected.clear(); cyclic = false; for(String v : graph.getVertices()) { TotalNeighborSearch tns = new TotalNeighborSearch(v); searcher.ConnectedBFS(v, tns); connected.put(v, tns.getTotal()); cyclic = cyclic || connected.get(v).contains(v); } } private static class TotalNeighborSearch implements SearchInterface { private String start; private Set<String> total; public TotalNeighborSearch(String s) { start = s; total = new HashSet<String>(); } public String getStartVertex() { return start; } public boolean isCyclic() { return total.contains(start); } public Set<String> getTotal() { return total; } public boolean searchNode(Graph g, String node) { total.add(node); return true; } } }