Given a Directed Graph and two vertices in it, check whether there is a path from the first given vertex to second.
Example:
Consider the following Graph:
Input : (u, v) = (1, 3)
Output: Yes
Explanation:
There is a path from 1 to 3, 1 -> 2 -> 3Input : (u, v) = (3, 6)
Output: No
Explanation:
There is no path from 3 to 6
A BFS or DFS based solution of this problem is discussed here.
Approach: Here we will discuss a Dynamic Programming based solution using Floyd Warshall Algorithm.
- Create a boolean 2D matrix mat where mat[i][j] will be true if there is a path from vertex i to j.
- For every starting vertex i and ending vertex j iterate over all intermediate vertex k and do check if there is a path for i to j through k then mark mat[i][j] as true.
- Finally, check if mat[u][v] is true then return true else return false.
Below is the implementation of the above approach:
C++
// C++ program to find if there is a// path between two vertices in a// directed graph using Dynamic Programming#include <bits/stdc++.h>using namespace std;#define X 6#define Z 2// function to find if there is a// path between two vertices in a// directed graphbool existPath(int V, int edges[X][Z], int u, int v){ // dp matrix bool mat[V][V]; memset(mat, false, sizeof(mat)); // set dp[i][j]=true if there is // edge between i to j for (int i = 0; i < X; i++) mat[edges[i][0]][edges[i][1]] = true; // check for all intermediate vertex for (int k = 0; k < V; k++) { for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { mat[i][j] = mat[i][j] || mat[i][k] && mat[k][j]; } } } // if vertex is invalid if (u >= V || v >= V) { return false; } // if there is a path if (mat[u][v]) return true; return false;}// Driver functionint main(){ int V = 4; int edges[X][Z] = { { 0, 2 }, { 0, 1 }, { 1, 2 }, { 2, 3 }, { 2, 0 }, { 3, 3 } }; int u = 1, v = 3; if (existPath(V, edges, u, v)) cout << "Yes\n"; else cout << "No\n"; return 0;} |
Java
// Java program to find if there is a path // between two vertices in a directed graph// using Dynamic Programmingimport java.util.*;class GFG{ static final int X = 6;static final int Z = 2;// Function to find if there is a// path between two vertices in a// directed graphstatic boolean existPath(int V, int edges[][], int u, int v){ // mat matrix boolean [][]mat = new boolean[V][V]; // set mat[i][j]=true if there is // edge between i to j for (int i = 0; i < X; i++) mat[edges[i][0]][edges[i][1]] = true; // Check for all intermediate vertex for(int k = 0; k < V; k++) { for(int i = 0; i < V; i++) { for(int j = 0; j < V; j++) { mat[i][j] = mat[i][j] || mat[i][k] && mat[k][j]; } } } // If vertex is invalid if (u >= V || v >= V) { return false; } // If there is a path if (mat[u][v]) return true; return false;}// Driver codepublic static void main(String[] args){ int V = 4; int edges[][] = { { 0, 2 }, { 0, 1 }, { 1, 2 }, { 2, 3 }, { 2, 0 }, { 3, 3 } }; int u = 1, v = 3; if (existPath(V, edges, u, v)) System.out.print("Yes\n"); else System.out.print("No\n");}}// This code is contributed by Princi Singh |
Python3
# Python3 program to find if there# is a path between two vertices in a# directed graph using Dynamic ProgrammingX = 6Z = 2 # Function to find if there is a# path between two vertices in a# directed graphdef existPath(V, edges, u, v): # dp matrix mat = [[False for i in range(V)] for j in range(V)] # Set dp[i][j]=true if there is # edge between i to j for i in range(X): mat[edges[i][0]][edges[i][1]] = True # Check for all intermediate vertex for k in range(V): for i in range(V): for j in range(V): mat[i][j] = (mat[i][j] or mat[i][k] and mat[k][j]) # If vertex is invalid if (u >= V or v >= V): return False # If there is a path if (mat[u][v]): return True return False# Driver code V = 4edges = [ [ 0, 2 ], [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 2, 0 ], [ 3, 3 ] ] u, v = 1, 3if (existPath(V, edges, u, v)): print("Yes")else: print("No")# This code is contributed by divyeshrabadiya07 |
C#
// C# program to find if there is a path // between two vertices in a directed graph// using Dynamic Programmingusing System;class GFG{ static readonly int X = 6;static readonly int Z = 2;// Function to find if there is a// path between two vertices in a// directed graphstatic bool existPath(int V, int [,]edges, int u, int v){ // mat matrix bool [,]mat = new bool[V, V]; // set mat[i,j]=true if there is // edge between i to j for (int i = 0; i < X; i++) mat[edges[i, 0], edges[i, 1]] = true; // Check for all intermediate vertex for(int k = 0; k < V; k++) { for(int i = 0; i < V; i++) { for(int j = 0; j < V; j++) { mat[i, j] = mat[i, j] || mat[i, k] && mat[k, j]; } } } // If vertex is invalid if (u >= V || v >= V) { return false; } // If there is a path if (mat[u, v]) return true; return false;}// Driver codepublic static void Main(String[] args){ int V = 4; int [,]edges = { { 0, 2 }, { 0, 1 }, { 1, 2 }, { 2, 3 }, { 2, 0 }, { 3, 3 } }; int u = 1, v = 3; if (existPath(V, edges, u, v)) Console.Write("Yes\n"); else Console.Write("No\n");}}// This code is contributed by sapnasingh4991 |
Javascript
<script>// Javascript program to find if there is a path // between two vertices in a directed graph// using Dynamic Programming var X = 6;var Z = 2;// Function to find if there is a// path between two vertices in a// directed graphfunction existPath(V, edges, u, v){ // mat matrix var mat = Array.from(Array(V), ()=>Array(V)); // set mat[i,j]=true if there is // edge between i to j for (var i = 0; i < X; i++) mat[edges[i][0]][edges[i][1]] = true; // Check for all intermediate vertex for(var k = 0; k < V; k++) { for(var i = 0; i < V; i++) { for(var j = 0; j < V; j++) { mat[i][j] = mat[i][j] || mat[i][k] && mat[k][j]; } } } // If vertex is invalid if (u >= V || v >= V) { return false; } // If there is a path if (mat[u][v]) return true; return false;}// Driver codevar V = 4;var edges = [ [ 0, 2 ], [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 2, 0 ], [ 3, 3 ] ];var u = 1, v = 3;if (existPath(V, edges, u, v)) document.write("Yes<br>");else document.write("No<br>");</script> |
Yes
Time Complexity : O ( V 3)
Auxiliary Space : O ( V 2)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

