Description
牛客网 2018校招真题 重要节点
Solving Ideas
BFS
创建一个标记数组arrive
,arrive[i][j]
为true
表示从i
可以到达j
, false
则不能
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* @author wylu
*/
public class Main {
//arrive[i][j]为true表示从i可以到达j, false则不能
static boolean[][] arrive;
static int[] sv;
static int[] tv;
static ArrayList<Integer>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strs = br.readLine().split(" ");
int n = Integer.parseInt(strs[0]), m = Integer.parseInt(strs[1]);
arrive = new boolean[n + 1][n + 1];
sv = new int[n + 1];
tv = new int[n + 1];
graph = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < m; i++) {
strs = br.readLine().split(" ");
int u = Integer.parseInt(strs[0]), v = Integer.parseInt(strs[1]);
graph[u].add(v);
}
for (int i = 1; i <= n; i++) bfs(i);
//根据arrive数组计算每个点能达到的点数和能达到每个点的点数
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (arrive[i][j]) {
sv[i]++;
tv[j]++;
}
}
}
int res = 0;
for (int i = 1; i <= n; i++) {
if (tv[i] > sv[i]) res++;
}
System.out.println(res);
}
//找出i这个点所能到达的所有点并在arrive数组中进行标记
private static void bfs(int i) {
LinkedList<Integer> queue = new LinkedList<>();
queue.offer(i);
arrive[i][i] = true;
while (!queue.isEmpty()) {
int cur = queue.poll();
for (Integer e : graph[cur]) {
if (!arrive[i][e]) {
arrive[i][e] = true;
queue.offer(e);
}
}
}
}
}