[USACO17DEC] Barn Painting

(f[i][j])(i)子树,当(i)(j)时的方案数

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
const int mod = 1e+9+7;
vector <int> g[N];
int vis[N],n,m,t1,t2,f[N][4],c[N];

void dfs(int p) {
    vis[p]=1;
    int flag = 0;
    f[p][1]=f[p][2]=f[p][3]=1;
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i];
        if(vis[q]) continue;
        flag = 1;
        dfs(q);
        for(int j=1;j<=3;j++) {
            int tmp=0;
            for(int k=1;k<=3;k++) {
                if(j!=k) tmp+=f[q][k];
            }
            f[p][j]*=tmp, f[p][j]%=mod;
        }
    }
    if(c[p]) {
        for(int i=1;i<=3;i++) {
            if(i==c[p]) continue;
            f[p][i]=0;
        }
    }
}

signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<n;i++) {
        scanf("%lld%lld",&t1,&t2);
        g[t1].push_back(t2);
        g[t2].push_back(t1);
    }
    for(int i=1;i<=m;i++) {
        scanf("%lld%lld",&t1,&t2);
        c[t1]=t2;
    }
    dfs(1);
    cout<<(f[1][1]+f[1][2]+f[1][3])%mod<<endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/12266371.html