Number of ways to select a node from each connected component
Last Updated :
29 Jul, 2021
Given a graph with N nodes and M edges. The task is to find the number of ways to select a node from each connected component of the given graph.
Examples:
Input:
Output: 3
(1, 4), (2, 4), (3, 4) are possible ways.
Input:
Output: 6
(1, 4, 5), (2, 4, 5), (3, 4, 5), (1, 4, 6), (2, 4, 6), (3, 4, 6) are possible ways.
Approach: A product of the number of nodes in each connected component is the required answer. Run a simple dfs to find the number of nodes in each connected component.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define N 100005
int n, m, temp;
vector< int > gr[N];
int vis[N];
void Add_edges( int x, int y)
{
gr[x].push_back(y);
gr[y].push_back(x);
}
void dfs( int ch)
{
vis[ch] = 1;
temp++;
for ( auto i : gr[ch])
if (!vis[i])
dfs(i);
}
int NumberOfWays()
{
int ans = 1;
memset (vis, 0, sizeof vis);
for ( int i = 1; i <= n; i++) {
if (!vis[i]) {
temp = 0;
dfs(i);
ans *= temp;
}
}
return ans;
}
int main()
{
n = 4, m = 2;
Add_edges(1, 2);
Add_edges(1, 3);
cout << NumberOfWays();
return 0;
}
|
Java
import java.util.*;
class GFG
{
static final int N = 100005 ;
static int n, m, temp;
static Vector<Integer> []gr = new Vector[N];
static int []vis = new int [N];
static void Add_edges( int x, int y)
{
gr[x].add(y);
gr[y].add(x);
}
static void dfs( int ch)
{
vis[ch] = 1 ;
temp++;
for ( int i : gr[ch])
if (vis[i] == 0 )
dfs(i);
}
static int NumberOfWays()
{
int ans = 1 ;
Arrays.fill(vis, 0 );
for ( int i = 1 ; i <= n; i++)
{
if (vis[i] == 0 )
{
temp = 0 ;
dfs(i);
ans *= temp;
}
}
return ans;
}
public static void main(String[] args)
{
n = 4 ;
m = 2 ;
for ( int i = 0 ; i < N; i++)
gr[i] = new Vector<Integer>();
Add_edges( 1 , 2 );
Add_edges( 1 , 3 );
System.out.print(NumberOfWays());
}
}
|
Python3
def Add_edges(x, y):
gr[x].append(y)
gr[y].append(x)
def dfs(ch):
vis[ch] = 1
global temp
temp + = 1
for i in gr[ch]:
if not vis[i]:
dfs(i)
def NumberOfWays():
ans = 1
global temp
for i in range ( 1 , n + 1 ):
if not vis[i]:
temp = 0
dfs(i)
ans * = temp
return ans
if __name__ = = "__main__" :
n, m, temp = 4 , 2 , 0
N = 100005
gr = [[] for i in range (N)]
vis = [ None ] * N
Add_edges( 1 , 2 )
Add_edges( 1 , 3 )
print (NumberOfWays())
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static readonly int N = 100005;
static int n, m, temp;
static List< int > []gr = new List< int >[N];
static int []vis = new int [N];
static void Add_edges( int x, int y)
{
gr[x].Add(y);
gr[y].Add(x);
}
static void dfs( int ch)
{
vis[ch] = 1;
temp++;
foreach ( int i in gr[ch])
if (vis[i] == 0)
dfs(i);
}
static int NumberOfWays()
{
int ans = 1;
for ( int i= 0; i < N; i++)
vis[i] = 0;
for ( int i = 1; i <= n; i++)
{
if (vis[i] == 0)
{
temp = 0;
dfs(i);
ans *= temp;
}
}
return ans;
}
public static void Main(String[] args)
{
n = 4;
m = 2;
for ( int i = 0; i < N; i++)
gr[i] = new List< int >();
Add_edges(1, 2);
Add_edges(1, 3);
Console.Write(NumberOfWays());
}
}
|
Javascript
<script>
let N = 100005;
let n, m, temp;
let gr = new Array(N);
let vis = new Array(N);
function Add_edges(x,y)
{
gr[x].push(y);
gr[y].push(x);
}
function dfs(ch)
{
vis[ch] = 1;
temp++;
for (let i of gr[ch])
if (vis[i] == 0)
dfs(i);
}
function NumberOfWays()
{
let ans = 1;
for (let i=0;i<vis.length;i++)
vis[i]=0;
for (let i = 1; i <= n; i++)
{
if (vis[i] == 0)
{
temp = 0;
dfs(i);
ans *= temp;
}
}
return ans;
}
n = 4;
m = 2;
for (let i = 0; i < N; i++)
gr[i] = [];
Add_edges(1, 2);
Add_edges(1, 3);
document.write(NumberOfWays());
</script>
|
Share your thoughts in the comments
Please Login to comment...