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++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; #define N 100005 int n, m, temp; vector< int > gr[N]; int vis[N]; // Function to add edges in the graph void Add_edges( int x, int y) { gr[x].push_back(y); gr[y].push_back(x); } // Function for DFS void dfs( int ch) { // Mark node as visited vis[ch] = 1; // Count number of nodes in a component temp++; for ( auto i : gr[ch]) if (!vis[i]) dfs(i); } // Function to return the required number of ways int NumberOfWays() { // To store the required answer int ans = 1; memset (vis, 0, sizeof vis); for ( int i = 1; i <= n; i++) { // If current node hasn't been visited yet if (!vis[i]) { temp = 0; dfs(i); // Multiply it with the answer ans *= temp; } } return ans; } // Driver code int main() { n = 4, m = 2; // Add edges Add_edges(1, 2); Add_edges(1, 3); cout << NumberOfWays(); return 0; } |
Java
// Java implementation of the approach 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]; // Function to add edges in the graph static void Add_edges( int x, int y) { gr[x].add(y); gr[y].add(x); } // Function for DFS static void dfs( int ch) { // Mark node as visited vis[ch] = 1 ; // Count number of nodes in a component temp++; for ( int i : gr[ch]) if (vis[i] == 0 ) dfs(i); } // Function to return the required number of ways static int NumberOfWays() { // To store the required answer int ans = 1 ; Arrays.fill(vis, 0 ); for ( int i = 1 ; i <= n; i++) { // If current node hasn't been visited yet if (vis[i] == 0 ) { temp = 0 ; dfs(i); // Multiply it with the answer ans *= temp; } } return ans; } // Driver code public static void main(String[] args) { n = 4 ; m = 2 ; for ( int i = 0 ; i < N; i++) gr[i] = new Vector<Integer>(); // Add edges Add_edges( 1 , 2 ); Add_edges( 1 , 3 ); System.out.print(NumberOfWays()); } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 implementation of the approach # Function to add edges in the graph def Add_edges(x, y): gr[x].append(y) gr[y].append(x) # Function for DFS def dfs(ch): # Mark node as visited vis[ch] = 1 global temp # Count number of nodes # in a component temp + = 1 for i in gr[ch]: if not vis[i]: dfs(i) # Function to return the required # number of ways def NumberOfWays(): # To store the required answer ans = 1 global temp for i in range ( 1 , n + 1 ): # If current node hasn't been # visited yet if not vis[i]: temp = 0 dfs(i) # Multiply it with the answer ans * = temp return ans # Driver code if __name__ = = "__main__" : n, m, temp = 4 , 2 , 0 N = 100005 gr = [[] for i in range (N)] vis = [ None ] * N # Add edges Add_edges( 1 , 2 ) Add_edges( 1 , 3 ) print (NumberOfWays()) # This code is contributed by Rituraj Jain |
C#
// C# implementation of the approach 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]; // Function to add edges in the graph static void Add_edges( int x, int y) { gr[x].Add(y); gr[y].Add(x); } // Function for DFS static void dfs( int ch) { // Mark node as visited vis[ch] = 1; // Count number of nodes in a component temp++; foreach ( int i in gr[ch]) if (vis[i] == 0) dfs(i); } // Function to return the required number of ways static int NumberOfWays() { // To store the required answer int ans = 1; for ( int i= 0; i < N; i++) vis[i] = 0; for ( int i = 1; i <= n; i++) { // If current node hasn't been visited yet if (vis[i] == 0) { temp = 0; dfs(i); // Multiply it with the answer ans *= temp; } } return ans; } // Driver code public static void Main(String[] args) { n = 4; m = 2; for ( int i = 0; i < N; i++) gr[i] = new List< int >(); // Add edges Add_edges(1, 2); Add_edges(1, 3); Console.Write(NumberOfWays()); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // Javascript implementation of the approach let N = 100005; let n, m, temp; let gr = new Array(N); let vis = new Array(N); // Function to add edges in the graph function Add_edges(x,y) { gr[x].push(y); gr[y].push(x); } // Function for DFS function dfs(ch) { // Mark node as visited vis[ch] = 1; // Count number of nodes in a component temp++; for (let i of gr[ch]) if (vis[i] == 0) dfs(i); } // Function to return the required number of ways function NumberOfWays() { // To store the required answer let ans = 1; for (let i=0;i<vis.length;i++) vis[i]=0; for (let i = 1; i <= n; i++) { // If current node hasn't been visited yet if (vis[i] == 0) { temp = 0; dfs(i); // Multiply it with the answer ans *= temp; } } return ans; } // Driver code n = 4; m = 2; for (let i = 0; i < N; i++) gr[i] = []; // Add edges Add_edges(1, 2); Add_edges(1, 3); document.write(NumberOfWays()); // This code is contributed by unknown2108 </script> |
3
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!