From f3613382aab6b15e50560a759c9b6e41038a6515 Mon Sep 17 00:00:00 2001 From: Siddhant Swarup Mallick <78552027+siddhant2002@users.noreply.github.com> Date: Tue, 28 Feb 2023 16:16:17 +0530 Subject: [PATCH] Add All Paths from Source to Target (fixes #3359) (#3873) --- .../AllPathsFromSourceToTarget.java | 108 ++++++++++++++++++ .../AllPathsFromSourceToTargetTest.java | 56 +++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/main/java/com/thealgorithms/backtracking/AllPathsFromSourceToTarget.java create mode 100644 src/test/java/com/thealgorithms/backtracking/AllPathsFromSourceToTargetTest.java diff --git a/src/main/java/com/thealgorithms/backtracking/AllPathsFromSourceToTarget.java b/src/main/java/com/thealgorithms/backtracking/AllPathsFromSourceToTarget.java new file mode 100644 index 00000000..424c451e --- /dev/null +++ b/src/main/java/com/thealgorithms/backtracking/AllPathsFromSourceToTarget.java @@ -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> 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> list2 = List.of(List.of(2, 0, 1, 3),List.of(2, 0, 3),List.of(2, 1, 3)); + List> 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> 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> 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> list2 = List.of(List.of(1, 0, 2, 5),List.of(1, 0, 5),List.of(1, 5),List.of(1, 2, 5)); + List> 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> list2 = List.of(List.of(0, 1, 2),List.of(0, 2)); + List> list1 = AllPathsFromSourceToTarget.allPathsFromSourceToTarget(vertices,a,source,destination); + list2=list1; + assertIterableEquals(list1, list2); + } +} \ No newline at end of file