P3252 [JLOI2012] 树

· · 题解

简单题,两层DFS,一定用链式前向星存树别问我怎么知道的)!!

主要代码如下:

``cpp

class Tree_Route {
    #define maxn 100000
    struct node {
        int v;
        int next;
    }e[maxn];
    int tot = 0, front[maxn];

public :

        int N,S;
        int list[maxn];
        int cnt;
    private : int Addedge(int u, int v) {
        tot++;
        e[tot].v = v;
        e[tot].next = front[u];
        front[u] = tot;
    }
    public : int Readin() {
        ios::sync_with_stdio(false);
        cin >> N >> S;
        for(int i=1;i<=N;i++) cin >> list[i];
        for(int i=1;i<=N-1;i++) {
            int fa, son;
            cin >> fa >> son;
            Addedge(fa, son);
        }
        cnt = 0;
    }
    public : int dfs(int now, int cur) {
        int sum=0;
        //cout << now << endl;
        if(cur == S) return 1;
        else if(cur > S) return 0;
        for(int i=front[now];i!=0;i=e[i].next) {
            sum += dfs(e[i].v, cur + list[e[i].v]);
        }
        return sum;
    }
    public : int Main_Process(int root) {
        cnt += dfs(root, list[root]);
        //cout << root << endl;
        for(int i=front[root];i!=0;i=e[i].next) {
            Main_Process(e[i].v);
        }
    }
}solver;