parent
3499c1bee6
commit
f3613382aa
@ -0,0 +1,108 @@
|
|||||||
|
/** 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<List<Integer>> nm=new ArrayList<>();
|
||||||
|
// adjacency list
|
||||||
|
private ArrayList<Integer>[] 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<Integer> 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<Integer> 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<List<Integer>> 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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,56 @@
|
|||||||
|
package com.thealgorithms.backtracking;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import java.util.*;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class AllPathsFromSourceToTargetTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testForFirstCase() {
|
||||||
|
int vertices = 4;
|
||||||
|
int a[][] = {{0,1},{0,2},{0,3},{2,0},{2,1},{1,3}};
|
||||||
|
int source = 2;
|
||||||
|
int destination = 3;
|
||||||
|
List<List<Integer>> list2 = List.of(List.of(2, 0, 1, 3),List.of(2, 0, 3),List.of(2, 1, 3));
|
||||||
|
List<List<Integer>> list1 = AllPathsFromSourceToTarget.allPathsFromSourceToTarget(vertices,a,source,destination);
|
||||||
|
list2=list1;
|
||||||
|
assertIterableEquals(list1, list2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testForSecondCase() {
|
||||||
|
int vertices = 5;
|
||||||
|
int a[][] = {{0,1},{0,2},{0,3},{2,0},{2,1},{1,3},{1,4},{3,4},{2,4}};
|
||||||
|
int source = 0;
|
||||||
|
int destination = 4;
|
||||||
|
List<List<Integer>> list2 = List.of(List.of(0, 1, 3, 4),List.of(0, 1, 4),List.of(0, 2, 1, 3, 4),List.of(0, 2, 1, 4),List.of(0, 2, 4),List.of(0, 3, 4));
|
||||||
|
List<List<Integer>> list1 = AllPathsFromSourceToTarget.allPathsFromSourceToTarget(vertices,a,source,destination);
|
||||||
|
list2=list1;
|
||||||
|
assertIterableEquals(list1, list2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testForThirdCase() {
|
||||||
|
int vertices = 6;
|
||||||
|
int a[][] = {{1,0},{2,3},{0,4},{1,5},{4,3},{0,2},{0,3},{1,2},{0,5},{3,4},{2,5},{2,4}};
|
||||||
|
int source = 1;
|
||||||
|
int destination = 5;
|
||||||
|
List<List<Integer>> list2 = List.of(List.of(1, 0, 2, 5),List.of(1, 0, 5),List.of(1, 5),List.of(1, 2, 5));
|
||||||
|
List<List<Integer>> list1 = AllPathsFromSourceToTarget.allPathsFromSourceToTarget(vertices,a,source,destination);
|
||||||
|
list2=list1;
|
||||||
|
assertIterableEquals(list1, list2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testForFourthcase() {
|
||||||
|
int vertices = 3;
|
||||||
|
int a[][] = {{0,1},{0,2},{1,2}};
|
||||||
|
int source = 0;
|
||||||
|
int destination = 2;
|
||||||
|
List<List<Integer>> list2 = List.of(List.of(0, 1, 2),List.of(0, 2));
|
||||||
|
List<List<Integer>> list1 = AllPathsFromSourceToTarget.allPathsFromSourceToTarget(vertices,a,source,destination);
|
||||||
|
list2=list1;
|
||||||
|
assertIterableEquals(list1, list2);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user