barn painting G

题目:

https://www.luogu.com.cn/problem/P4084

如果被染色了,只有一种染色方式,其他的为0

没被染色的,三种都可以

链式前向星存图

#include<stdio.h>
typedef long long ll;
 const int maxn=1e5+7;
    const int mod=1e9+7;
    int head[maxn],cnt,col[maxn],v[maxn];
    ll dp[maxn][4];
    struct node
    {
        int nxt,to;
    }e[maxn<<1];
    inline void add(int u,int v)
    {
        e[++cnt].to=v;
        e[cnt].nxt=head[u];
        head[u]=cnt;
    }
    void dfs(int i)
    {
        v[i]=1;
        if(col[i])
        {
            dp[i][col[i]]=1;
        }
        else
        {
            dp[i][1]=dp[i][2]=dp[i][3]=1;
        }
        for(int j=head[i];j;j=e[j].nxt)
        {
            int to=e[j].to;
            if(!v[to])
            {
                dfs(to);
                dp[i][1]=dp[i][1]*((dp[to][2]+dp[to][3])%mod)%mod;
                dp[i][2]=dp[i][2]*((dp[to][1]+dp[to][3])%mod)%mod;
                dp[i][3]=dp[i][3]*((dp[to][1]+dp[to][2])%mod)%mod;

            }

        }
    }
int main()
{
   int n,k,u,v;
   scanf("%d%d",&n,&k);
   for(int i=1;i<n;i++)
    scanf("%d%d",&u,&v),add(u,v),add(v,u);
    for(int i=1;i<=k;i++)
    {
        int x,y;scanf("%d%d",&x,&y); col[x]=y;
    }
    dfs(1);
    printf("%lld\n",((dp[1][1]+dp[1][2])%mod+dp[1][3])%mod);

}

 

posted @ 2021-08-13 10:44  废柴废柴少女  阅读(32)  评论(0)    收藏  举报