图中的汇节点数
给定一个有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 是边数。
相关文章:
名人问题