Skip to content
Snippets Groups Projects
BFSAndDFSApp.java 2.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
    import it.uniupo.graphLib.GraphInterface;
    
    Gianluca's avatar
    Gianluca committed
    import it.uniupo.graphLib.UndirectedGraph;
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
    
    import java.util.Arrays;
    import java.util.ArrayList;
    
    public class BFSAndDFSApp {
        private GraphInterface myGraph;
        private BFS bfs;
        private DFS dfs;
    
        private boolean[] scoperti;
        private int[] fathers;
        GraphInterface treeDFS;
    
    
    Gianluca's avatar
    Gianluca committed
        public BFSAndDFSApp(GraphInterface g) {
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
            myGraph = g;
            BFS bfs = new BFS(g);
            DFS dfs = new DFS(g);
            this.scoperti = new boolean[myGraph.getOrder()];
            this.treeDFS = this.myGraph.create();
            this.fathers = new int[myGraph.getOrder()];
            Arrays.fill(this.fathers, -1);
        }
    
        private boolean visitaDFS(int sorg) {
            if (sorg >= this.myGraph.getOrder() || sorg < 0) {
                throw new IllegalArgumentException("Sorgente non presenten nel grafo");
            }
            scoperti[sorg] = true;
            for (int node : this.myGraph.getNeighbors(sorg)) {
                if (!scoperti[node]) {
                    fathers[node] = node;
                    treeDFS.addEdge(sorg, node);
                    return visitaDFS(node);
    
    Gianluca's avatar
    Gianluca committed
                } else if (node != fathers[node]) {
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
                    return true;
                }
            }
            return false;
        }
    
        public boolean hasUndirectedCycle() {
            for (int nodo = 0; nodo < this.myGraph.getOrder(); nodo++) {
    
    Gianluca's avatar
    Gianluca committed
                if (visitaDFS(nodo)) {
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
                    return true;
                }
            }
            return false;
        }
    
        private void visitaDFSPostVisit(int sorg, ArrayList<Integer> orderPostVisit) {
            if (sorg >= this.myGraph.getOrder() || sorg < 0) {
                throw new IllegalArgumentException("Sorgente non presenten nel grafo");
            }
            scoperti[sorg] = true;
            for (int node : this.myGraph.getNeighbors(sorg)) {
                if (!scoperti[node]) {
                    visitaDFSPostVisit(node, orderPostVisit);
                }
            }
            orderPostVisit.add(sorg);
        }
    
    
    Gianluca's avatar
    Gianluca committed
        public ArrayList<Integer> getNodesInOrderPostVisit(int sorg) {
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
            ArrayList<Integer> orderPostVisit = new ArrayList<>();
            visitaDFSPostVisit(sorg, orderPostVisit);
            return orderPostVisit;
        }
    
    Gianluca's avatar
    Gianluca committed
    
        private boolean hasDirCycleImpl(int sorg) {
            scoperti[sorg] = true;
            for (Integer node : myGraph.getNeighbors(sorg)) {
                if (!scoperti[node]) {
                    fathers[node] = sorg;
                    return hasDirCycleImpl(node);
                } else if (node != fathers[sorg]) {
                    return true;
                }
            }
            return false;
        }
    
        public boolean hasDirCycle() {
            if (myGraph instanceof UndirectedGraph) {
                throw new IllegalArgumentException("Impossibile usare hasDirCycle su un grafo non orientato");
            }
            for (int i = 0; i < myGraph.getOrder(); i++) {
                fathers = new int[myGraph.getOrder()];
                scoperti = new boolean[myGraph.getOrder()];
                if (hasDirCycleImpl(i)) {
                    return true;
                }
            }
            return false;
        }
    
    Gianluca Mastrolonardo's avatar
    Ok
    Gianluca Mastrolonardo committed
    }