重要节点
https://www.nowcoder.com/practice/56901e8163d141108ec59fb603bffb4f
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
// 邻接节点
private static HashSet<Integer>[] adj;
// 入度
private static int[] T;
// 出度
private static int[] S;
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
solution(in);
}
}
/**
* 模拟法: bfs
* @param in
*/
private static void solution(Scanner in){
int V = in.nextInt();
int E = in.nextInt();
adj = new HashSet[V+1];
for(int i=1; i<=V; i++){
adj[i] = new HashSet<>();
}
T = new int[V+1];
S = new int[V+1];
int u,v;
for(int i=1; i<=E; i++){
u = in.nextInt();
v = in.nextInt();
// 去环
if(u != v){
adj[u].add(v);
}
}
for(int i=1; i<=V; i++){
bfs(i);
}
int count = 0;
for(int i=1; i<=V; i++){
if(T[i] > S[i]){
count++;
}
}
System.out.println(count);
}
/**
* 广度优先搜索
* @param start
* @return
*/
private static void bfs(int start){
HashSet<Integer> visited = new HashSet<>();
Queue<Integer> queue = new LinkedList<>();
visited.add(start);
queue.offer(start);
int size;
while(!queue.isEmpty()){
Integer u;
size = queue.size();
S[start] += size;
for(int i=1; i<=size; i++){
u = queue.poll();
T[u]++;
for(Integer v: adj[u]){
if(!visited.contains(v)){
visited.add(v);
queue.offer(v);
}
}
}
}
}
}