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); }
浙公网安备 33010602011771号