From c25d402cd836b55addfb08445c9ef3c3f56e4f03 Mon Sep 17 00:00:00 2001 From: Gianluca <gianlucamastrolonardo10@gmail.com> Date: Wed, 24 Apr 2024 18:32:57 +0200 Subject: [PATCH] es4 finito --- .../Laboratorio/Lab5/Test/TestKosaraju.java | 28 +++++++++++++++++-- .../Laboratorio/Lab5/src/Kosaraju.java | 18 +++++------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java b/Algoritmi_2/Laboratorio/Lab5/Test/TestKosaraju.java index b4d05a8..edc862a 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 422c085..01ac1c1 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++; } } -- GitLab