Número de Nodes receptores en un gráfico

Dado un gráfico acíclico dirigido de n Nodes (numerados del 1 al n) y m aristas. La tarea es encontrar el número de Nodes sumideros. Un Node sumidero es un Node del que no emerge ningún borde.

Ejemplos: 

Input : n = 4, m = 2
        Edges[] = {{2, 3}, {4, 3}} 
Output : 2

Number of sink nodes in a graph

Only node 1 and node 3 are sink nodes.

Input : n = 4, m = 2
        Edges[] = {{3, 2}, {3, 4}} 
Output : 3

La idea es iterar a través de todos los bordes. Y para cada borde, marque el Node de origen del que salió el borde. Ahora, para cada Node, compruebe si está marcado o no. Y cuenta los Nodes sin marcar. 

Algoritmo: 

 
1. Make any array A[] of size equal to the
    number of nodes and initialize to 1.
2. Traverse all the edges one by one, say, 
   u -> v.
     (i) Mark A[u] as 1.
3. Now traverse whole array A[] and count 
   number of unmarked nodes.

A continuación se muestra la implementación de este enfoque:  

C++

// C++ program to count number if sink nodes
#include<bits/stdc++.h>
using namespace std;
  
// Return the number of Sink NOdes.
int countSink(int n, int m, int edgeFrom[],
                        int edgeTo[])
{
    // Array for marking the non-sink node.
    int mark[n];
    memset(mark, 0, sizeof mark);
  
    // Marking the non-sink node.
    for (int i = 0; i < m; i++)
        mark[edgeFrom[i]] = 1;
  
    // Counting the sink nodes.
    int count = 0;
    for (int i = 1; i <= n ; i++)
        if (!mark[i])
            count++;
  
    return count;
}
  
// Driven Program
int main()
{
    int n = 4, m = 2;
    int edgeFrom[] = { 2, 4 };
    int edgeTo[] = { 3, 3 };
  
    cout << countSink(n, m, edgeFrom, edgeTo) << endl;
  
    return 0;
}

Java

// Java program to count number if sink nodes
import java.util.*;
  
class GFG
{
  
// Return the number of Sink NOdes.
static int countSink(int n, int m, 
                     int edgeFrom[], int edgeTo[])
{
    // Array for marking the non-sink node.
    int []mark = new int[n + 1];
  
    // Marking the non-sink node.
    for (int i = 0; i < m; i++)
        mark[edgeFrom[i]] = 1;
  
    // Counting the sink nodes.
    int count = 0;
    for (int i = 1; i <= n ; i++)
        if (mark[i] == 0)
            count++;
  
    return count;
}
  
// Driver Code
public static void main(String[] args)
{
    int n = 4, m = 2;
    int edgeFrom[] = { 2, 4 };
    int edgeTo[] = { 3, 3 };
  
    System.out.println(countSink(n, m, 
                       edgeFrom, edgeTo));
}
}
  
// This code is contributed by 29AjayKumar

Python3

# Python3 program to count number if sink nodes
  
# Return the number of Sink NOdes. 
def countSink(n, m, edgeFrom, edgeTo):
      
    # Array for marking the non-sink node. 
    mark = [0] * (n + 1)
  
    # Marking the non-sink node.
    for i in range(m):
        mark[edgeFrom[i]] = 1
  
    # Counting the sink nodes. 
    count = 0
    for i in range(1, n + 1):
        if (not mark[i]): 
            count += 1
  
    return count
  
# Driver Code
if __name__ == '__main__': 
      
    n = 4
    m = 2
    edgeFrom = [2, 4] 
    edgeTo = [3, 3]
  
    print(countSink(n, m, edgeFrom, edgeTo))
  
# This code is contributed by PranchalK

C#

// C# program to count number if sink nodes
using System;
      
class GFG
{
  
// Return the number of Sink NOdes.
static int countSink(int n, int m, 
                     int []edgeFrom,
                     int []edgeTo)
{
    // Array for marking the non-sink node.
    int []mark = new int[n + 1];
  
    // Marking the non-sink node.
    for (int i = 0; i < m; i++)
        mark[edgeFrom[i]] = 1;
  
    // Counting the sink nodes.
    int count = 0;
    for (int i = 1; i <= n ; i++)
        if (mark[i] == 0)
            count++;
  
    return count;
}
  
// Driver Code
public static void Main(String[] args)
{
    int n = 4, m = 2;
    int []edgeFrom = { 2, 4 };
    int []edgeTo = { 3, 3 };
  
    Console.WriteLine(countSink(n, m, 
                      edgeFrom, edgeTo));
}
}
  
// This code is contributed by PrinciRaj1992

Javascript

<script>
  
// Javascript program to count number if sink nodes
  
// Return the number of Sink NOdes.
function countSink(n, m, edgeFrom, edgeTo)
{
      
    // Array for marking the non-sink node.
    let mark = new Array(n + 1);
    for(let i = 0; i < n + 1; i++)
    {
        mark[i] = 0;
    }
      
    // Marking the non-sink node.
    for(let i = 0; i < m; i++)
        mark[edgeFrom[i]] = 1;
    
    // Counting the sink nodes.
    let count = 0;
    for(let i = 1; i <= n; i++)
        if (mark[i] == 0)
            count++;
    
    return count;
}
  
// Driver Code
let n = 4, m = 2;
let edgeFrom = [ 2, 4 ];
let edgeTo = [ 3, 3 ];
  
document.write(countSink(n, m, 
                         edgeFrom, edgeTo));
  
// This code is contributed by rag2127
  
</script>

Producción: 

2

Complejidad temporal: O(m + n) donde n es el número de Nodes ym es el número de aristas.

Artículo Relacionado:  
El Problema de la Celebridad

Este artículo es una contribución de Anuj Chauhan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *