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 100005int n, m, temp;vector<int> gr[N];int vis[N];// Function to add edges in the graphvoid Add_edges(int x, int y){ gr[x].push_back(y); gr[y].push_back(x);}// Function for DFSvoid 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 waysint 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 codeint 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 graphdef Add_edges(x, y): gr[x].append(y) gr[y].append(x)# Function for DFSdef 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 waysdef 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 codeif __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!


… [Trackback]
[…] Here you will find 91519 more Info on that Topic: geeksforgeeks.org/number-of-ways-to-select-a-node-from-each-connected-component/ […]