P4084 [USACO17DEC]Barn Painting


水一道计数题,增加博客数目(雾)

#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
int n,m,ne,head[100005],a,b,dp[100005][4];
struct node {int to,nxt;}eg[100005<<1];
void adde(int u,int v){eg[++ne].to=v;eg[ne].nxt=head[u];head[u]=ne;}
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=eg[i].nxt)if(eg[i].to!=fa)dfs(eg[i].to,u);
    for(int i=head[u];i;i=eg[i].nxt)
    {
        int v=eg[i].to;
        if(v==fa)continue;
        dp[u][1]=(1ll*dp[u][1]*(dp[v][2]+dp[v][3]))%mod;
        dp[u][2]=(1ll*dp[u][2]*(dp[v][3]+dp[v][1]))%mod;
        dp[u][3]=(1ll*dp[u][3]*(dp[v][1]+dp[v][2]))%mod;    
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<n;i++)
    {
        cin>>a>>b;
        adde(a,b);
        adde(b,a);
        dp[i][1]=dp[i][2]=dp[i][3]=1;
    }dp[n][1]=dp[n][2]=dp[n][3]=1;
    while(m--)
    {
        cin>>a>>b;
        if(b==1)dp[a][2]=dp[a][3]=0;
        if(b==2)dp[a][1]=dp[a][3]=0;
        if(b==3)dp[a][1]=dp[a][2]=0;
    }
    dfs(1,0);
    cout<<(1ll*dp[1][1]+1ll*dp[1][2]+1ll*dp[1][3])%mod;
}

原文地址:https://www.cnblogs.com/SFWR-YOU/p/11406035.html