
If N = 3 and defense = {{2,1}, {2,0}}.
There are a total of three snipers, and the sniper 1 and 0 both are defended by sniper 2. So, Ninja can kill sniper 2 first, and then he can kill the rest two snipers in any order. Hence, the answer is YES, as Ninja can kill all the snipers.
The first line contains an integer ‘T', which denotes the number of test cases or queries to be run. Then, the T test cases follow.
The first line of each test case contains two space-separated integers N and M, denoting the total number of snipers and the number of elements in the array “defense”.
Then M lines follow. Each line contains two space-separated integers denoting the sniper defending and the sniper defended
For each test case, print “YES”, if Ninja can kill all the snipers. Print “NO” otherwise.
Output for each test case will be printed in a separate line.
You do not need to print anything. It has already been taken care of. Just implement the given function.
1 <= T <= 100
2 <= N <= 5000
1 <= M <= 5000
0 <= defense[i][0], defense[i][1] <= N-1
Time limit: 1 sec
The idea here is to draw directed edges from each sniper who is defending to the sniper who is being defended. Then, we check whether there is a cycle present in the graph or not. If a cycle is present, that means the snipers can not be killed as they are being defended by each other. So, the answer is “NO” in that case. If there are no cycles present in the graph, then the answer is “YES”.
Algorithm
bool isCyclePresent(N, graph[N][]):
bool isCyclePresentUtil(graph[N][], src, &visited[], &stack[]):
The idea is the same as the previous approach, i.e., our major focus is to detect a cycle in the directed graph. But here we are using a BFS based approach, and we are trying to find a topological order of the graph. If topological sorting is possible, then the graph doesn’t contain any cycle; otherwise, a cycle is present.
So, we first find the in-degree of each node. Push all the nodes that have a 0 indegree to the queue. Then we do a BFS, and for each current node, we decrease the in-degree of its neighbors by 1. Now, if the in-degree of any node becomes 0 in the process, push that node to the queue as well. Keep a count variable to keep track of the number of nodes that have entered the queue. After the BFS is over, if the value of the count is equal to N, then there is no cycle; otherwise, a cycle is present.
Algorithm
bool isCyclePresent(N, graph[N][])