Given an integer N, representing the number of nodes present in an undirected graph, with each node valued from 1 to N, and a 2D array Edges[][], representing the pair of vertices connected by an edge, the task is to find a set of at most N/2 nodes such that nodes that are not present in the set, are connected adjacent to any one of the nodes present in the set.
Examples :
Input: N = 4, Edges[][2] = {{2, 3}, {1, 3}, {4, 2}, {1, 2}} Output: 3 2 Explanation: Connections specified in the above graph are as follows: 1 / \ 2 – 3 | 4 Selecting the set {2, 3} satisfies the required conditions.
Input: N = 5, Edges[][2] = {{2, 1}, {3, 1}, {3, 2}, {4, 1}, {4, 2}, {4, 3}, {5, 1}, {5, 2}, {5, 3}, {5, 4}} Output: 1
Approach: The given problem can be solved based on the following observations:
- Assume a node to be the source node, then the distance of each vertex from the source node will be either odd or even.
- Split the nodes into two different sets based on parity, the size of at least one of the sets will not exceed N/2. Since each node of some parity is connected to at least one node of opposite parity, the criteria of choosing at most N/2 nodes is satisfied.
Follow the steps below to solve the problem:
- Assume any vertex to be the source node.
- Initialize two sets, say evenParity and oddParity, to store the nodes having even and odd distances from the source node respectively.
- Perform BFS Traversal on the given graph and split the vertices into two different sets depending on the parity of their distances from the source:
- After completing the above steps, print the elements of the set with the minimum size.
C++
#include <bits/stdc++.h>
using namespace std;
void addEdge(vector<vector< int > >& adj,
int u, int v)
{
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<vector< int > > BFS(
int N, int source,
vector<vector< int > > adjlist)
{
int dist[N + 1];
vector<vector< int > > vertex_set;
memset (dist, -1, sizeof dist);
vertex_set.assign(2, vector< int >(0));
queue< int > Q;
Q.push(source);
dist = 0;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
vertex_set[dist[u] % 2].push_back(u);
for ( int i = 0;
i < ( int )adjlist[u].size(); i++) {
int v = adjlist[u][i];
if (dist[v] == -1) {
dist[v] = dist[u] + 1;
Q.push(v);
}
}
}
return vertex_set;
}
void findSet( int N,
vector<vector< int > > adjlist)
{
int source = 1;
vector<vector< int > > vertex_set
= BFS(N, source, adjlist);
int in = 0;
if (vertex_set[1].size()
< vertex_set[0].size())
in = 1;
for ( int node : vertex_set[in]) {
cout << node << " " ;
}
}
int main()
{
int N = 5;
int M = 8;
vector<vector< int > > adjlist;
adjlist.assign(N + 1, vector< int >(0));
addEdge(adjlist, 2, 5);
addEdge(adjlist, 2, 1);
addEdge(adjlist, 5, 1);
addEdge(adjlist, 4, 5);
addEdge(adjlist, 1, 4);
addEdge(adjlist, 2, 4);
addEdge(adjlist, 3, 4);
addEdge(adjlist, 3, 5);
findSet(N, adjlist);
return 0;
}
|
Python3
from collections import deque
def addEdge(adj, u, v):
adj[u].append(v)
adj[v].append(u)
return adj
def BFS(N, source, adjlist):
dist = [ - 1 ] * (N + 1 )
vertex_set = [[] for i in range ( 2 )]
Q = deque()
Q.append(source)
dist = 0
while len (Q) > 0 :
u = Q.popleft()
vertex_set[dist[u] % 2 ].append(u)
for i in range ( len (adjlist[u])):
v = adjlist[u][i]
if (dist[v] = = - 1 ):
dist[v] = dist[u] + 1
Q.append(v)
return vertex_set
def findSet(N, adjlist):
source = 1
vertex_set = BFS(N, source, adjlist)
inn = 0
if ( len (vertex_set[ 1 ]) < len (vertex_set[ 0 ])):
inn = 1
for node in vertex_set[inn]:
print (node, end = " " )
if __name__ = = '__main__' :
N = 5
M = 8
adjlist = [[] for i in range (N + 1 )]
adjlist = addEdge(adjlist, 2 , 5 )
adjlist = addEdge(adjlist, 2 , 1 )
adjlist = addEdge(adjlist, 5 , 1 )
adjlist = addEdge(adjlist, 4 , 5 )
adjlist = addEdge(adjlist, 1 , 4 )
adjlist = addEdge(adjlist, 2 , 4 )
adjlist = addEdge(adjlist, 3 , 4 )
adjlist = addEdge(adjlist, 3 , 5 )
findSet(N, adjlist)
|
Java
import java.util.LinkedList;
import java.util.Queue;
class Main {
static void addEdge(LinkedList<Integer>[] adj, int u, int v) {
adj[u].add(v);
adj[v].add(u);
}
static LinkedList<Integer>[] BFS( int N, int source, LinkedList<Integer>[] adjlist) {
int [] dist = new int [N+ 1 ];
for ( int i = 0 ; i <= N; i++) {
dist[i] = - 1 ;
}
LinkedList<Integer>[] vertex_set = new LinkedList[ 2 ];
vertex_set[ 0 ] = new LinkedList<Integer>();
vertex_set[ 1 ] = new LinkedList<Integer>();
Queue<Integer> Q = new LinkedList<Integer>();
Q.add(source);
dist = 0 ;
while (Q.size() > 0 ) {
int u = Q.remove();
vertex_set[dist[u] % 2 ].add(u);
for (Integer v : adjlist[u]) {
if (dist[v] == - 1 ) {
dist[v] = dist[u] + 1 ;
Q.add(v);
}
}
}
return vertex_set;
}
static void findSet( int N, LinkedList<Integer>[] adjlist) {
int source = 1 ;
LinkedList<Integer>[] vertex_set = BFS(N, source, adjlist);
int inn = 0 ;
if (vertex_set[ 1 ].size() < vertex_set[ 0 ].size()) {
inn = 1 ;
}
for ( int node : vertex_set[inn]) {
System.out.print(node + " " );
}
}
public static void main(String[] args) {
int N = 5 ;
int M = 8 ;
LinkedList<Integer>[] adjlist = new LinkedList[N+ 1 ];
for ( int i = 0 ; i <= N; i++) {
adjlist[i] = new LinkedList<Integer>();
}
addEdge(adjlist, 2 , 5 );
addEdge(adjlist, 2 , 1 );
addEdge(adjlist, 5 , 1 );
addEdge(adjlist, 4 , 5 );
addEdge(adjlist, 1 , 4 );
addEdge(adjlist, 2 , 4 );
addEdge(adjlist, 3 , 4 );
addEdge(adjlist, 3 , 5 );
findSet(N, adjlist);
}
}
|
Javascript
function addEdge(adj, u, v) {
adj[u].push(v);
adj[v].push(u);
return adj;
}
function BFS(N, source, adjlist) {
let dist = new Array(N + 1).fill(-1);
let vertex_set = [[], []];
let Q = [];
Q.push(source);
dist = 0;
while (Q.length > 0) {
let u = Q.shift();
vertex_set[dist[u] % 2].push(u);
for (let i = 0; i < adjlist[u].length; i++) {
let v = adjlist[u][i];
if (dist[v] === -1) {
dist[v] = dist[u] + 1;
Q.push(v);
}
}
}
return vertex_set;
}
function findSet(N, adjlist) {
let source = 1;
let vertex_set = BFS(N, source, adjlist);
let inn = 0;
if (vertex_set[1].length < vertex_set[0].length) {
inn = 1;
}
for (let node of vertex_set[inn]) {
console.log(node);
}
}
let N = 5;
let M = 8;
let adjlist = new Array(N + 1).fill([]);
adjlist = addEdge(adjlist, 2, 5);
adjlist = addEdge(adjlist, 2, 1);
adjlist = addEdge(adjlist, 5, 1);
adjlist = addEdge(adjlist, 4, 5);
adjlist = addEdge(adjlist, 1, 4);
adjlist = addEdge(adjlist, 2, 4);
adjlist = addEdge(adjlist, 3, 4);
adjlist = addEdge(adjlist, 3, 5);
findSet(N, adjlist);
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void AddEdge(List<List< int >> adj, int u, int v)
{
adj[u].Add(v);
adj[v].Add(u);
}
static List<List< int >> BFS( int N, int source, List<List< int >> adjlist)
{
int [] dist = new int [N + 1];
for ( int i = 0; i < dist.Length; i++)
{
dist[i] = -1;
}
List<List< int >> vertex_set = new List<List< int >>();
vertex_set.Add( new List< int >());
vertex_set.Add( new List< int >());
Queue< int > Q = new Queue< int >();
Q.Enqueue(source);
dist = 0;
while (Q.Count > 0)
{
int u = Q.Dequeue();
vertex_set[dist[u] % 2].Add(u);
for ( int i = 0; i < adjlist[u].Count; i++)
{
int v = adjlist[u][i];
if (dist[v] == -1)
{
dist[v] = dist[u] + 1;
Q.Enqueue(v);
}
}
}
return vertex_set;
}
static void FindSet( int N, List<List< int >> adjlist)
{
int source = 1;
List<List< int >> vertex_set = BFS(N, source, adjlist);
int inIndex = 0;
if (vertex_set[1].Count < vertex_set[0].Count)
{
inIndex = 1;
}
foreach ( int node in vertex_set[inIndex])
{
Console.Write(node + " " );
}
}
static void Main( string [] args)
{
int N = 5;
int M = 8;
List<List< int >> adjlist = new List<List< int >>();
for ( int i = 0; i < N + 1; i++)
{
adjlist.Add( new List< int >());
}
AddEdge(adjlist, 2, 5);
AddEdge(adjlist, 2, 1);
AddEdge(adjlist, 5, 1);
AddEdge(adjlist, 4, 5);
AddEdge(adjlist, 1, 4);
AddEdge(adjlist, 2, 4);
AddEdge(adjlist, 3, 4);
AddEdge(adjlist, 3, 5);
FindSet(N, adjlist);
}
}
|
Time Complexity: O(N + M) Auxiliary Space: O(N + M)
|