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