
// Connectivity.java
// Barak Naveh and Contributors, 2021
// Modified by Andrew Davison, ad@coe.psu.ac.th, Jan. 2023

/* Utilizes the ConnectivityInspector class which
   detects connected components in an undirected graph 
   and weakly connected components in a directed graph.

   Also uses a listenable graph so changes to the underlying graph
   at run time will be seen.

   For related code, see StrongConnectivity.java

   Usage:
    > compile Connectivity.java
    > run Connectivity
*/


import org.jgrapht.*;
import org.jgrapht.graph.*;
import org.jgrapht.alg.connectivity.*;



public class Connectivity
{

  public static void main(String args[])
  {
    ListenableGraph<String, DefaultEdge> g =
                   new DefaultListenableGraph<>(
                      new DefaultDirectedGraph<>(DefaultEdge.class));
    g.addVertex("v1");
    g.addVertex("v2");
    g.addVertex("v3");
    g.addEdge("v1", "v2");  // unweighted

    // display
    System.out.println("Adj List:\n" + JGTUtils.writeAdjList(g));
    JGTUtils.displayAsDOT("Initial graph", g);

    ConnectivityInspector<String, DefaultEdge> inspector =
                                      new ConnectivityInspector<>(g);
    g.addGraphListener(inspector);  // will see modifications to g

    System.out.println("Is connected? " + inspector.isConnected());

    System.out.println("\nAdding edge v1 --> v3");
    g.addEdge("v1", "v3");

    // redisplay
    System.out.println("Adj List:\n" + JGTUtils.writeAdjList(g));
    JGTUtils.displayAsDOT("Modified graph", g);

    System.out.println("Is modified graph connected? " + inspector.isConnected());
  } /* main */

}  // end of Connectivity class
