/** * Author : Siddhant Swarup Mallick * Github : https://github.com/siddhant2002 */ /** Program description - To find all possible paths from source to destination*/ /**Wikipedia link -> https://en.wikipedia.org/wiki/Shortest_path_problem */ package com.thealgorithms.backtracking; import java.util.*; public class AllPathsFromSourceToTarget { // No. of vertices in graph private int v; // To store the paths from source to destination static List> nm = new ArrayList<>(); // adjacency list private ArrayList[] adjList; // Constructor public AllPathsFromSourceToTarget(int vertices) { // initialise vertex count this.v = vertices; // initialise adjacency list initAdjList(); } // utility method to initialise adjacency list private void initAdjList() { adjList = new ArrayList[v]; for (int i = 0; i < v; i++) { adjList[i] = new ArrayList<>(); } } // add edge from u to v public void addEdge(int u, int v) { // Add v to u's list. adjList[u].add(v); } public void storeAllPaths(int s, int d) { boolean[] isVisited = new boolean[v]; ArrayList pathList = new ArrayList<>(); // add source to path[] pathList.add(s); // Call recursive utility storeAllPathsUtil(s, d, isVisited, pathList); } // A recursive function to print all paths from 'u' to 'd'. // isVisited[] keeps track of vertices in current path. // localPathList<> stores actual vertices in the current path private void storeAllPathsUtil( Integer u, Integer d, boolean[] isVisited, List localPathList) { if (u.equals(d)) { nm.add(new ArrayList<>(localPathList)); return; } // Mark the current node isVisited[u] = true; // Recursion for all the vertices adjacent to current vertex for (Integer i : adjList[u]) { if (!isVisited[i]) { // store current node in path[] localPathList.add(i); storeAllPathsUtil(i, d, isVisited, localPathList); // remove current node in path[] localPathList.remove(i); } } // Mark the current node isVisited[u] = false; } // Driver program public static List> allPathsFromSourceToTarget( int vertices, int[][] a, int source, int destination) { // Create a sample graph AllPathsFromSourceToTarget g = new AllPathsFromSourceToTarget(vertices); for (int i = 0; i < a.length; i++) { g.addEdge(a[i][0], a[i][1]); // edges are added } g.storeAllPaths(source, destination); // method call to store all possible paths return nm; // returns all possible paths from source to destination } }