📜  图中的汇节点数

📅  最后修改于: 2022-05-13 01:57:53.892000             🧑  作者: Mango

图中的汇节点数

给定一个有n 个节点(编号从 1 到 n)和m个边的有向无环图。任务是找到汇节点的数量。汇节点是一个没有边缘出现的节点。

例子:

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

图中的汇节点数

Only node 1 and node 3 are sink nodes.

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

这个想法是遍历所有边缘。对于每条边,标记出边的源节点。现在,对于每个节点,检查它是否被标记。并计算未标记的节点。

算法:

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.

下面是这种方法的实现:

C++
// C++ program to count number if sink nodes
#include
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


输出:

2

时间复杂度: O(m + n),其中 n 是节点数,m 是边数。

相关文章:
名人问题