Find the maximum value permutation of a graph
Last Updated :
07 Jun, 2021
Given a graph containing N nodes. For any permutation of nodes P1, P2, P3, …, PN the value of the permutation is defined as the number of indices which have at least 1 node on the left of it that has an edge to it. Find the maximum value across all permutations.
Examples:
Input: N = 3, edges[] = {{1, 2}, {2, 3}}
Output: 2
Consider the permutation 2 1 3
Node 1 has node 2 on the left of it and there is an edge connecting them in the graph.
Node 3 has node 2 on the left of it and there is an edge connecting them in the graph.
Input: N = 4, edges[] = {{1, 3}, {2, 4}}
Output: 2
Consider the permutation 1 2 3 4
Node 3 has node 1 on the left of it and there is an edge connecting them in the graph.
Node 4 has node 2 on the left of it and there is an edge connecting them in the graph.
Approach: Let’s start with any node at the beginning, we can follow it up with any node adjacent to it and repeat the process. This resembles a dfs traversal in which every node except the first node has a node before it with which it shares an edge. So for every connected component, the maximum value we can get for the permutation of the nodes of this component is Size of component – 1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int dfs( int x, vector< int > adj[], int vis[])
{
int sz = 1;
vis[x] = 1;
for ( auto ch : adj[x])
if (!vis[ch])
sz += dfs(ch, adj, vis);
return sz;
}
int maxValue( int n, vector< int > adj[])
{
int val = 0;
int vis[n + 1] = { 0 };
for ( int i = 1; i <= n; i++)
if (!vis[i])
val += dfs(i, adj, vis) - 1;
return val;
}
int main()
{
int n = 3;
vector< int > adj[n + 1] = { { 1, 2 }, { 2, 3 } };
cout << maxValue(n, adj);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int vis[];
static int dfs( int x, Vector<Vector<Integer>> adj)
{
int sz = 1 ;
vis[x] = 1 ;
for ( int i = 0 ; i < adj.get(x).size(); i++)
if (vis[adj.get(x).get(i)] == 0 )
sz += dfs(adj.get(x).get(i), adj);
return sz;
}
static int maxValue( int n, Vector<Vector<Integer>> adj)
{
int val = 0 ;
vis = new int [n + 1 ];
for ( int i = 0 ; i < n; i++)
vis[i] = 0 ;
for ( int i = 0 ; i < n; i++)
if (vis[i] == 0 )
val += dfs(i, adj) - 1 ;
return val;
}
public static void main(String args[])
{
int n = 3 ;
Vector<Vector<Integer>> adj = new Vector<Vector<Integer>>() ;
Vector<Integer> v = new Vector<Integer>();
v.add( 0 );
v.add( 1 );
Vector<Integer> v1 = new Vector<Integer>();
v1.add( 1 );
v1.add( 2 );
adj.add(v);
adj.add(v1);
adj.add( new Vector<Integer>());
System.out.println( maxValue(n, adj));
}
}
|
Python3
def dfs(x, adj, vis):
sz = 1
vis[x] = 1
for ch in adj:
if ( not vis[ch]):
sz + = dfs(ch, adj, vis)
return sz
def maxValue(n, adj):
val = 0
vis = [ 0 ] * (n + 1 )
for i in range ( 1 , n + 1 ):
if ( not vis[i]):
val + = dfs(i, adj, vis) - 1
return val
if __name__ = = '__main__' :
n = 3
adj = [ 1 , 2 , 2 , 3 ]
print (maxValue(n, adj))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int []vis ;
static int dfs( int x, List<List< int >> adj)
{
int sz = 1;
vis[x] = 1;
for ( int i = 0; i < adj[x].Count; i++)
if (vis[adj[x][i]] == 0)
sz += dfs(adj[x][i], adj);
return sz;
}
static int maxValue( int n, List<List< int >> adj)
{
int val = 0;
vis = new int [n + 1];
for ( int i = 0; i < n; i++)
vis[i] = 0;
for ( int i = 0; i < n; i++)
if (vis[i] == 0)
val += dfs(i, adj) - 1;
return val;
}
public static void Main(String []args)
{
int n = 3;
List<List< int >> adj = new List<List< int >>() ;
List< int > v = new List< int >();
v.Add(0);
v.Add(1);
List< int > v1 = new List< int >();
v1.Add(1);
v1.Add(2);
adj.Add(v);
adj.Add(v1);
adj.Add( new List< int >());
Console.WriteLine( maxValue(n, adj));
}
}
|
Javascript
<script>
function dfs(x, adj, vis)
{
if (x>1)
return 1;
var sz = 1;
vis[x] = 1;
adj[x].forEach(ch => {
if (!vis[ch])
sz += dfs(ch, adj, vis);
});
return sz;
}
function maxValue(n, adj)
{
var val = 0;
var vis = Array(n+1).fill(0);
for ( var i = 0; i < n; i++)
if (!vis[i])
val += dfs(i, adj, vis) - 1;
return val;
}
var n = 2;
var adj = [ [ 0, 1 ], [ 1, 2] ];
document.write( maxValue(n, adj));
</script>
|
Time Complexity: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...