Contar el número de Nodes no accesibles

Dado un gráfico no dirigido y un conjunto de vértices, tenemos que contar el número de Nodes no alcanzables del Node principal dado mediante una búsqueda en profundidad.

Considere el siguiente gráfico no dirigido con dos componentes desconectados:

C++

// C++ program to count non-reachable nodes
// from a given source using DFS.
#include <iostream>
#include <list>
using namespace std;
  
// Graph class represents a directed graph
// using adjacency list representation
class Graph {
    int V; // No. of vertices
  
    // Pointer to an array containing
    // adjacency lists
    list<int>* adj;
  
    // A recursive function used by DFS
    void DFSUtil(int v, bool visited[]);
  
public:
    Graph(int V); // Constructor
  
    // function to add an edge to graph
    void addEdge(int v, int w);
  
    // DFS traversal of the vertices
    // reachable from v
    int countNotReach(int v);
};
  
Graph::Graph(int V)
{
    this->V = V;
    adj = new list<int>[V];
}
  
void Graph::addEdge(int v, int w)
{
    adj[v].push_back(w); // Add w to v’s list.
    adj[w].push_back(v); // Add v to w's list.
}
  
void Graph::DFSUtil(int v, bool visited[])
{
    // Mark the current node as visited and
    // print it
    visited[v] = true;
  
    // Recur for all the vertices adjacent
    // to this vertex
    list<int>::iterator i;
    for (i = adj[v].begin(); i != adj[v].end(); ++i)
        if (!visited[*i])
            DFSUtil(*i, visited);
}
  
// Returns count of not reachable nodes from
// vertex v.
// It uses recursive DFSUtil()
int Graph::countNotReach(int v)
{
    // Mark all the vertices as not visited
    bool* visited = new bool[V];
    for (int i = 0; i < V; i++)
        visited[i] = false;
  
    // Call the recursive helper function
    // to print DFS traversal
    DFSUtil(v, visited);
  
    // Return count of not visited nodes
    int count = 0;
    for (int i = 0; i < V; i++) {
        if (visited[i] == false)
            count++;
    }
    return count;
}
  
int main()
{
    // Create a graph given in the above diagram
    Graph g(8);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(3, 4);
    g.addEdge(4, 5);
    g.addEdge(6, 7);
  
    cout << g.countNotReach(2);
  
    return 0;
}

Java

// Java program to count non-reachable nodes
// from a given source using DFS.
import java.util.*;
   
// Graph class represents a directed graph
// using adjacency list representation
@SuppressWarnings("unchecked")
class Graph{
       
// No. of vertices    
public int V; 
   
// Pointer to an array containing
// adjacency lists
public ArrayList []adj;
   
public Graph(int V)
{
    this.V = V;
    adj = new ArrayList[V];
    for(int i = 0; i < V; i++)
    {
        adj[i] = new ArrayList();
    }
}
    
void addEdge(int v, int w)
{
       
    // add w to v’s list.
    adj[v].add(w);
       
    // add v to w's list.
    adj[w].add(v); 
}
    
void DFSUtil(int v, boolean []visited)
{
       
    // Mark the current node as visited and
    // print it
    visited[v] = true;
       
    // Recur for all the vertices adjacent
    // to this vertex
    for(int i : (ArrayList<Integer>)adj[v])
    {
        if (!visited[i])
            DFSUtil(i, visited);
    }
}
    
// Returns count of not reachable nodes from
// vertex v.
// It uses recursive DFSUtil()
int countNotReach(int v)
{
       
    // Mark all the vertices as not visited
    boolean []visited = new boolean[V];
       
    for(int i = 0; i < V; i++)
        visited[i] = false;
    
    // Call the recursive helper function
    // to print DFS traversal
    DFSUtil(v, visited);
    
    // Return count of not visited nodes
    int count = 0;
    for(int i = 0; i < V; i++) 
    {
        if (visited[i] == false)
            count++;
    }
    return count;
}
   
// Driver Code
public static void main(String []args)
{
       
    // Create a graph given in the above diagram
    Graph g = new Graph(8);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(3, 4);
    g.addEdge(4, 5);
    g.addEdge(6, 7);
    
    System.out.print(g.countNotReach(2));
}
}
  
// This code is contributed by Pratham76

Python3

# Python3 program to count non-reachable 
# nodes from a given source using DFS. 
  
# Graph class represents a directed graph 
# using adjacency list representation 
class Graph:
    def __init__(self, V):
        self.V = V
        self.adj = [[] for i in range(V)]
  
    def addEdge(self, v, w):
        self.adj[v].append(w) # Add w to v’s list. 
        self.adj[w].append(v) # Add v to w's list.
      
    def DFSUtil(self, v, visited):
          
        # Mark the current node as 
        # visited and print it 
        visited[v] = True
      
        # Recur for all the vertices 
        # adjacent to this vertex
        i = self.adj[v][0]
        for i in self.adj[v]:
            if (not visited[i]): 
                self.DFSUtil(i, visited) 
      
    # Returns count of not reachable 
    # nodes from vertex v. 
    # It uses recursive DFSUtil() 
    def countNotReach(self, v):
          
        # Mark all the vertices as not visited 
        visited = [False] * self.V
      
        # Call the recursive helper 
        # function to print DFS traversal 
        self.DFSUtil(v, visited) 
      
        # Return count of not visited nodes 
        count = 0
        for i in range(self.V):
            if (visited[i] == False): 
                count += 1
        return count
  
# Driver Code
if __name__ == '__main__':
  
    # Create a graph given in the
    # above diagram 
    g = Graph(8) 
    g.addEdge(0, 1) 
    g.addEdge(0, 2) 
    g.addEdge(1, 2) 
    g.addEdge(3, 4) 
    g.addEdge(4, 5) 
    g.addEdge(6, 7) 
  
    print(g.countNotReach(2))
  
# This code is contributed by PranchalK

C#

// C# program to count non-reachable nodes
// from a given source using DFS.
using System;
using System.Collections;
using System.Collections.Generic;
  
// Graph class represents a directed graph
// using adjacency list representation
class Graph{
      
// No. of vertices    
public int V; 
  
// Pointer to an array containing
// adjacency lists
public ArrayList []adj;
  
public Graph(int V)
{
    this.V = V;
    adj = new ArrayList[V];
    for(int i = 0; i < V; i++)
    {
        adj[i] = new ArrayList();
    }
}
   
void addEdge(int v, int w)
{
      
    // Add w to v’s list.
    adj[v].Add(w);
      
    // Add v to w's list.
    adj[w].Add(v); 
}
   
void DFSUtil(int v, bool []visited)
{
      
    // Mark the current node as visited and
    // print it
    visited[v] = true;
      
    // Recur for all the vertices adjacent
    // to this vertex
    foreach(int i in (ArrayList)adj[v])
    {
        if (!visited[i])
            DFSUtil(i, visited);
    }
}
   
// Returns count of not reachable nodes from
// vertex v.
// It uses recursive DFSUtil()
int countNotReach(int v)
{
      
    // Mark all the vertices as not visited
    bool []visited = new bool[V];
      
    for(int i = 0; i < V; i++)
        visited[i] = false;
   
    // Call the recursive helper function
    // to print DFS traversal
    DFSUtil(v, visited);
   
    // Return count of not visited nodes
    int count = 0;
    for(int i = 0; i < V; i++) 
    {
        if (visited[i] == false)
            count++;
    }
    return count;
}
  
// Driver Code
static void Main(string []args)
{
      
    // Create a graph given in the above diagram
    Graph g = new Graph(8);
    g.addEdge(0, 1);
    g.addEdge(0, 2);
    g.addEdge(1, 2);
    g.addEdge(3, 4);
    g.addEdge(4, 5);
    g.addEdge(6, 7);
   
    Console.Write(g.countNotReach(2));
}
}
  
// This code is contributed by rutvik_56

Javascript

<script>
    // Javascript program to count non-reachable nodes
    // from a given source using DFS.
      
    // Graph class represents a directed graph
    // using adjacency list representation
    let V = 8;
    let adj = [];
    for(let i = 0; i < V; i++)
    {
      adj.push([]);
    }
      
    function addEdge(v, w)
    {
  
        // Add w to v’s list.
        adj[v].push(w);
  
        // Add v to w's list.
        adj[w].push(v);
    }
  
    function DFSUtil(v, visited)
    {
  
        // Mark the current node as visited and
        // print it
        visited[v] = true;
  
        // Recur for all the vertices adjacent
        // to this vertex
        for(let i = 0; i < adj[v].length; i++)
        {
            if (!visited[adj[v][i]])
                DFSUtil(adj[v][i], visited);
        }
    }
  
    // Returns count of not reachable nodes from
    // vertex v.
    // It uses recursive DFSUtil()
    function countNotReach(v)
    {
  
        // Mark all the vertices as not visited
        let visited = new Array(V);
  
        for(let i = 0; i < V; i++)
            visited[i] = false;
  
        // Call the recursive helper function
        // to print DFS traversal
        DFSUtil(v, visited);
  
        // Return count of not visited nodes
        let count = 0;
        for(let i = 0; i < V; i++)
        {
            if (visited[i] == false)
                count++;
        }
        return count;
    }
      
    // Create a graph given in the above diagram
    addEdge(0, 1);
    addEdge(0, 2);
    addEdge(1, 2);
    addEdge(3, 4);
    addEdge(4, 5);
    addEdge(6, 7);
    
    document.write(countNotReach(2));
      
    // This code is contributed by suresh07.
</script>

Publicación traducida automáticamente

Artículo escrito por shivani.mittal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *