java用记忆化搜索第7个点为什么RE了呢?
查看原帖
java用记忆化搜索第7个点为什么RE了呢?
645290
pipishan楼主2022/5/18 19:38

代码

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++;
    }
}
2022/5/18 19:38
加载中...