publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); // 动态规划数组,表示该节点有多少条子路径。 int[] dp = newint[n + 1]; // 入度数组。 int[] in = newint[n + 1]; ArrayList<ArrayList<Integer>> nums = new ArrayList<>(); for (int i = 0; i <= n; i++) { dp[i] = -1; in[i] = 0; nums.add(new ArrayList<>()); } for (int i = 0; i < m; i++) { int x = scanner.nextInt(); int y = scanner.nextInt(); nums.get(x).add(y); in[y]++; } int ans = 0; // 遍历入度为0的根结点。 for (int i = 1; i <= n; i++) { if (in[i] == 0) { ans += dfs(i, true, dp, nums); } } System.out.println(ans); }
publicstaticintdfs(int id, boolean checkSingle, int[] dp, ArrayList<ArrayList<Integer>> nums){ if (dp[id] != -1) { return dp[id]; } if (nums.get(id).size() == 0) { // 如果为孤立节点则返回0 if (checkSingle) { return0; } else { return1; } } int count = 0; for (int i = 0; i < nums.get(id).size(); i++) { count += dfs(nums.get(id).get(i), false, dp, nums); } dp[id] = count; return count; }