diff --git a/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java b/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java index b4d05a80f171694c707314996661c719f9932d9b..edc862a26dbc0b8e4fa8dfdf6d4806282588299b 100644 --- a/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java +++ b/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java @@ -5,6 +5,8 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.Objects; public class TestKosaraju { @@ -28,8 +30,28 @@ class TestKosaraju { @Test void testGetSCC() { - DirectedGraph g = new DirectedGraph("5; 1 4; 4 3; 3 1; 1 2; 4 0; 2 0; 0 2;"); - Kosaraju kosaraju = new Kosaraju(g); - System.out.println(Arrays.toString(kosaraju.getSCC())); + DirectedGraph gOneNode = new DirectedGraph(1); + Kosaraju kosarajuOneNode = new Kosaraju(gOneNode); + Assertions.assertEquals(kosarajuOneNode.getSCC()[0], 0); + + DirectedGraph dag = new DirectedGraph("4; 0 2; 0 1; 1 2; 1 3"); + Kosaraju kosarajuDag = new Kosaraju(dag); + int[] expectedSCCDag1 = {0, 1, 3, 2}; + int[] expectedSCCDag2 = {0, 1, 2, 3}; + Assertions.assertTrue(Arrays.equals(kosarajuDag.getSCC(), expectedSCCDag1) || Arrays.equals(kosarajuDag.getSCC(), expectedSCCDag2)); + + DirectedGraph gOneCycle = new DirectedGraph("3; 0 1; 1 2; 2 0"); + Kosaraju kosarajuOneCycle = new Kosaraju(gOneCycle); + for (int i = 0; i < kosarajuOneCycle.getSCC().length; i++) { + Assertions.assertEquals(kosarajuOneCycle.getSCC()[i], 0); + } + + + DirectedGraph gBig = new DirectedGraph("5; 1 4; 4 3; 3 1; 1 2; 4 0; 2 0; 0 2;"); + Kosaraju kosarajuBig = new Kosaraju(gBig); + Assertions.assertEquals(kosarajuBig.getSCC()[0], kosarajuBig.getSCC()[2]); + Assertions.assertEquals(kosarajuBig.getSCC()[1], kosarajuBig.getSCC()[3]); + Assertions.assertEquals(kosarajuBig.getSCC()[3], kosarajuBig.getSCC()[4]); + Assertions.assertNotEquals(kosarajuBig.getSCC()[0], kosarajuBig.getSCC()[1]); } } diff --git a/Algoritmi_2/Laboratorio/Lab5/src/Kosaraju.java b/Algoritmi_2/Laboratorio/Lab5/src/Kosaraju.java index 422c085264896a1be8abcd6b200f229ff95f91bb..01ac1c1c1feec92f39047c747429800fa4d98ffe 100644 --- a/Algoritmi_2/Laboratorio/Lab5/src/Kosaraju.java +++ b/Algoritmi_2/Laboratorio/Lab5/src/Kosaraju.java @@ -12,7 +12,7 @@ class Kosaraju { private boolean[] founded; private ArrayList<Integer> postVisitOrder = new ArrayList<>(); - static private DirectedGraph reversedGraph; + static public DirectedGraph reversedGraph; Kosaraju(DirectedGraph g) { this.myGraph = g; @@ -45,14 +45,15 @@ class Kosaraju { return reversePostVisitOrderArray; } - public - void getSCCImpl(int sorg, int cnt) { + private + void visitaDFSOnReversedGraph(int sorg, int[] scc, int cnt) { founded[sorg] = true; - for (Integer neighbor : myGraph.getNeighbors(sorg)) { + for (Integer neighbor : reversedGraph.getNeighbors(sorg)) { if (!founded[neighbor]) { - getSCCImpl(neighbor, cnt); + visitaDFSOnReversedGraph(neighbor, scc, cnt); } } + scc[sorg] = cnt; } public @@ -62,13 +63,8 @@ class Kosaraju { ArrayList<Integer> reversePostVisitOrderArray = reversePostVisitOrder(); Arrays.fill(founded, false); for (Integer node : reversePostVisitOrderArray) { - postVisitOrder.clear(); //Uso l'array del OFV solo per sapere che nodi ho scoperto if (!founded[node]) { - visitaDFS(node); - ArrayList<Integer> foundedNode = postVisitOrder; - for (int foundednode : foundedNode) { - SCC[foundednode] = cnt; - } + visitaDFSOnReversedGraph(node, SCC, cnt); cnt++; } }