Given an undirected graph having N vertices and M edges and each vertex is associated with a cost and a source vertex S is given. The task is to find the maximum cost path from source vertex S such that no edge is visited consecutively 2 or more times.
Examples:
Input: N = 5, M = 5, source = 1, cost[] = {2, 2, 8, 6, 9}, Below is the given graph:

Output: 21
Explanation:
The maximum cost path matrix is given as:
1 -> 2 -> 0 -> 1 -> 4
Cost = 2 + 8 + 2 + 2 + 9 = 21
Input: N = 8, M = 8, source = 3, cost[] = {10, 11, 4, 12, 3, 4, 7, 9}

Output: 46
Explanation:
The maximum cost path matrix is given as:
3 -> 0 -> 2 -> 1 -> 7
Approach: The idea is to check if there exists a loop exists in the graph, then all vertices of the loop need to be traversed and then traverse graph towards the leaf nodes with the maximum cost. And if the loop does not exist then the problem statement converts to find maximum cost path in any directed graph.
Below are the declaration used in the program:
- dp[i]: stores the total cost to traverse the node ‘i’ and all it’s children node.
- vis[i]: marks the nodes which have been visited.
- canTake: stores the resultant sum of all node of maximum cost path excluding the leaf vertex and its children node, if it exists.
- best: stores the cost of a maximum cost leaf node and its children node(if it exists).
- check: boolean variable used as a flag to find a loop in the graph, its value changes to 0 when the loop is found.
Below are the steps:
- Perform DFS traversal with flag variable check set to ‘1’ initially denoting no loop found.
- Simultaneously build the dp[] for each node with the maximum cost updated till that traversed node.
- If the adjacent node is found to be already visited and it is not the parent node then the loop is found and set the value of the check to 0.
- Add the cost of all nodes of the loop to canTake.
- After traversing adjacent nodes of the traversing node, no loop is found, then it represents the cost of the path leading from loop to leaf vertex and updates best to dp[i] if dp[i] is greater than best.
- After traversal of the graph, print the sum of canTake and best.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int canTake;
int best;
vector< int > dp;
vector< bool > vis;
int dfs(vector<vector< int > >& g,
int * cost, int u, int pre)
{
vis[u] = true ;
dp[u] = cost[u];
bool check = 1;
int cur = cost[u];
for ( auto & x : g[u]) {
if (vis[x] && x != pre) {
check = 0;
}
else if (!vis[x]) {
check &= dfs(g, cost, x, u);
cur = max(cur,
cost[u] + dp[x]);
}
}
dp[u] = cur;
if (!check) {
canTake += cost[u];
}
else {
best = max(best, dp[u]);
}
return check;
}
int FindMaxCost(vector<vector< int > >& g,
int * cost, int source)
{
dfs(g, cost, source, -1);
cout << canTake + best;
}
int main()
{
int n = 5, m = 5;
dp.resize(n+1);
vis.resize(n+1);
int cost[] = { 2, 2, 8, 6, 9 };
vector<vector< int > > g(n);
g[0].push_back(1);
g[1].push_back(0);
g[0].push_back(2);
g[2].push_back(0);
g[0].push_back(3);
g[3].push_back(0);
g[1].push_back(2);
g[2].push_back(1);
g[1].push_back(4);
g[4].push_back(1);
int source = 1;
FindMaxCost(g, cost, source);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int N = 100000 ;
static int canTake;
static int best;
static int []dp = new int [N];
static boolean []vis = new boolean [N];
static boolean dfs(Vector<Integer> []g,
int []cost, int u, int pre)
{
vis[u] = true ;
dp[u] = cost[u];
boolean check = true ;
int cur = cost[u];
for ( int x : g[u])
{
if (vis[x] && x != pre)
{
check = false ;
}
else if (!vis[x])
{
check = dfs(g, cost, x, u) ?
false : true ;
cur = Math.max(cur, cost[u] +
dp[x]);
}
}
dp[u] = cur;
if (!check)
{
canTake += cost[u];
}
else
{
best = Math.max(best, dp[u]);
}
return check;
}
static void FindMaxCost(Vector<Integer> [] g,
int []cost, int source)
{
dfs(g, cost, source, - 1 );
System.out.print(canTake + best);
}
public static void main(String[] args)
{
int n = 5 , m = 5 ;
int cost[] = { 2 , 2 , 8 , 6 , 9 };
@SuppressWarnings ( "unchecked" )
Vector<Integer> []g = new Vector[n];
for ( int i = 0 ; i < g.length; i++)
g[i] = new Vector<Integer>();
g[ 0 ].add( 1 );
g[ 1 ].add( 0 );
g[ 0 ].add( 2 );
g[ 2 ].add( 0 );
g[ 0 ].add( 3 );
g[ 3 ].add( 0 );
g[ 1 ].add( 2 );
g[ 2 ].add( 1 );
g[ 1 ].add( 4 );
g[ 4 ].add( 1 );
int source = 1 ;
FindMaxCost(g, cost, source);
}
}
|
Python3
N = 100000
canTake = 0
best = 0
dp = [ 0 for i in range (N)]
vis = [ 0 for i in range (N)]
def dfs(g, cost, u, pre):
global canTake, best
vis[u] = True
dp[u] = cost[u]
check = 1
cur = cost[u]
for x in g[u]:
if (vis[x] and x ! = pre):
check = 0
elif ( not vis[x]):
check & = dfs(g, cost, x, u)
cur = max (cur, cost[u] + dp[x])
dp[u] = cur
if ( not check):
canTake + = cost[u]
else :
best = max (best, dp[u])
return check
def FindMaxCost(g, cost, source):
dfs(g, cost, source, - 1 )
print (canTake + best)
if __name__ = = '__main__' :
n = 5
m = 5
cost = [ 2 , 2 , 8 , 6 , 9 ]
g = [[] for i in range (n)]
g[ 0 ].append( 1 )
g[ 1 ].append( 0 )
g[ 0 ].append( 2 )
g[ 2 ].append( 0 )
g[ 0 ].append( 3 )
g[ 3 ].append( 0 )
g[ 1 ].append( 2 )
g[ 2 ].append( 1 )
g[ 1 ].append( 4 )
g[ 4 ].append( 1 )
source = 1
FindMaxCost(g, cost, source)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int N = 100000;
static int canTake;
static int best;
static int []dp = new int [N];
static bool []vis = new bool [N];
static bool dfs(List< int > []g,
int []cost,
int u, int pre)
{
vis[u] = true ;
dp[u] = cost[u];
bool check = true ;
int cur = cost[u];
foreach ( int x in g[u])
{
if (vis[x] && x != pre)
{
check = false ;
}
else if (!vis[x])
{
check = dfs(g, cost, x, u) ?
false : true ;
cur = Math.Max(cur, cost[u] + dp[x]);
}
}
dp[u] = cur;
if (!check)
{
canTake += cost[u];
}
else
{
best = Math.Max(best, dp[u]);
}
return check;
}
static void FindMaxCost(List< int > [] g,
int []cost, int source)
{
dfs(g, cost, source, -1);
Console.Write(canTake + best);
}
public static void Main(String[] args)
{
int n = 5, m = 5;
int []cost = {2, 2, 8, 6, 9};
List< int > []g = new List< int >[n];
for ( int i = 0; i < g.Length; i++)
g[i] = new List< int >();
g[0].Add(1);
g[1].Add(0);
g[0].Add(2);
g[2].Add(0);
g[0].Add(3);
g[3].Add(0);
g[1].Add(2);
g[2].Add(1);
g[1].Add(4);
g[4].Add(1);
int source = 1;
FindMaxCost(g, cost, source);
}
}
|
Javascript
<script>
var N = 100000;
var canTake = 0;
var best = 0;
var dp = Array(N).fill(0);
var vis = Array(N).fill( false );
function dfs(g, cost, u, pre)
{
vis[u] = true ;
dp[u] = cost[u];
var check = true ;
var cur = cost[u];
for ( var x of g[u])
{
if (vis[x] && x != pre)
{
check = false ;
}
else if (!vis[x])
{
check = dfs(g, cost, x, u) ?
false : true ;
cur = Math.max(cur, cost[u] + dp[x]);
}
}
dp[u] = cur;
if (!check)
{
canTake += cost[u];
}
else
{
best = Math.max(best, dp[u]);
}
return check;
}
function FindMaxCost(g, cost, source)
{
dfs(g, cost, source, -1);
document.write(canTake + best);
}
var n = 5, m = 5;
var cost = [2, 2, 8, 6, 9];
var g = Array.from(Array(n), ()=>Array());
g[0].push(1);
g[1].push(0);
g[0].push(2);
g[2].push(0);
g[0].push(3);
g[3].push(0);
g[1].push(2);
g[2].push(1);
g[1].push(4);
g[4].push(1);
var source = 1;
FindMaxCost(g, cost, source);
</script>
|
Time Complexity: O(N + M) where N is a number of vertices and M is the number of edges.
Auxiliary Space: O(N + M) where N is a number of vertices and M is a number of edges.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
24 Nov, 2021
Like Article
Save Article