Skip to content
Snippets Groups Projects
Commit c25d402c authored by Gianluca's avatar Gianluca
Browse files

es4 finito

parent 3e451b14
No related branches found
No related tags found
No related merge requests found
......@@ -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]);
}
}
......@@ -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++;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment