代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
/**
* P3183 [HAOI2016]食物链
*/
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static int in() throws IOException {
in.nextToken();
return (int) in.nval;
}
static int N = 100010;
static int M = 200010;
static int n, m;
static int[] h = new int[N];
static int[] e = new int[M];
static int[] ne = new int[M];
//是否存在入度:false:不存在,true:存在
static boolean[] st = new boolean[N];
//是否存在出度:false,不存在,true:存在
static boolean[] out = new boolean[N];
static int[] f = new int[N];
static int index;
public static void main(String[] args) throws IOException {
n = in();
m = in();
Arrays.fill(h, -1);
for (int i = 0; i < m; i++) {
int a = in();
int b = in();
add(a, b);
out[a] = true;
st[b] = true;
}
int res = 0;
for (int i = 1; i <= n; i++) {
//不存在入度且存在出度(也就是当前点是一个根节点但又不是孤立节点)
if(!st[i] && out[i]) {
int t = dfs(i);
res += t;
}
}
System.out.println(res);
}
public static int dfs(int u) {
if(f[u] != 0) {
return f[u];
}
if(!out[u]) {
return 1;
}
for (int i = h[u]; i != -1; i = ne[i]) {
int j = e[i];
f[u] += dfs(j);
}
return f[u];
}
public static void add(int a, int b) {
e[index] = b;
ne[index] = h[a];
h[a] = index++;
}
}