org.jgrapht.demo.DirectedGraphDemo Maven / Gradle / Ivy
/*
* (C) Copyright 2008-2021, by Minh Van Nguyen and Contributors.
*
* JGraphT : a free Java graph-theory library
*
* See the CONTRIBUTORS.md file distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0, or the
* GNU Lesser General Public License v2.1 or later
* which is available at
* http://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html.
*
* SPDX-License-Identifier: EPL-2.0 OR LGPL-2.1-or-later
*/
package org.jgrapht.demo;
//@example:main:begin
import org.jgrapht.*;
import org.jgrapht.alg.connectivity.*;
import org.jgrapht.alg.interfaces.ShortestPathAlgorithm.*;
import org.jgrapht.alg.interfaces.*;
import org.jgrapht.alg.shortestpath.*;
import org.jgrapht.graph.*;
import java.util.*;
//@example:main:end
/**
* This class demonstrates some of the operations that can be performed on directed graphs. After
* constructing a basic directed graph, it computes all the strongly connected components of this
* graph. It then finds the shortest path from one vertex to another using Dijkstra's shortest path
* algorithm. The sample code should help to clarify to users of JGraphT that the class
* org.jgrapht.alg.shortestpath.DijkstraShortestPath can be used to find shortest paths within
* directed graphs.
*
* @author Minh Van Nguyen
*/
public class DirectedGraphDemo
{
/**
* The starting point for the demo.
*
* @param args ignored.
*/
public static void main(String args[])
{
// @example:main:begin
// constructs a directed graph with the specified vertices and edges
Graph directedGraph =
new DefaultDirectedGraph(DefaultEdge.class);
directedGraph.addVertex("a");
directedGraph.addVertex("b");
directedGraph.addVertex("c");
directedGraph.addVertex("d");
directedGraph.addVertex("e");
directedGraph.addVertex("f");
directedGraph.addVertex("g");
directedGraph.addVertex("h");
directedGraph.addVertex("i");
directedGraph.addEdge("a", "b");
directedGraph.addEdge("b", "d");
directedGraph.addEdge("d", "c");
directedGraph.addEdge("c", "a");
directedGraph.addEdge("e", "d");
directedGraph.addEdge("e", "f");
directedGraph.addEdge("f", "g");
directedGraph.addEdge("g", "e");
directedGraph.addEdge("h", "e");
directedGraph.addEdge("i", "h");
// computes all the strongly connected components of the directed graph
StrongConnectivityAlgorithm scAlg =
new KosarajuStrongConnectivityInspector<>(directedGraph);
List> stronglyConnectedSubgraphs =
scAlg.getStronglyConnectedComponents();
// prints the strongly connected components
System.out.println("Strongly connected components:");
for (int i = 0; i < stronglyConnectedSubgraphs.size(); i++) {
System.out.println(stronglyConnectedSubgraphs.get(i));
}
System.out.println();
// Prints the shortest path from vertex i to vertex c. This certainly
// exists for our particular directed graph.
System.out.println("Shortest path from i to c:");
DijkstraShortestPath dijkstraAlg =
new DijkstraShortestPath<>(directedGraph);
SingleSourcePaths iPaths = dijkstraAlg.getPaths("i");
System.out.println(iPaths.getPath("c") + "\n");
// Prints the shortest path from vertex c to vertex i. This path does
// NOT exist for our particular directed graph. Hence the path is
// empty and the result must be null.
System.out.println("Shortest path from c to i:");
SingleSourcePaths cPaths = dijkstraAlg.getPaths("c");
System.out.println(cPaths.getPath("i"));
// @example:main:end
}
}