P3914-染色计数【树形dp】
生活随笔
收集整理的這篇文章主要介紹了
P3914-染色计数【树形dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problemnew/show/P3914
題目大意
nnn個點每個點有些可以染的顏色,要求相鄰顏色不相同,方案總數。
解題思路
樹形dpdpdp,定義fx,if_{x,i}fx,i?表示點xxx的染顏色iii的方案數。然后定義zx=∑i=1mfxiz_x=\sum_{i=1}^mf_{x_i}zx?=∑i=1m?fxi??
然后顯然動態轉移方程fx,i=zy?fy,i(x?>y)f_{x,i}=z_y-f_{y,i}(x->y)fx,i?=zy??fy,i?(x?>y)
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int XJQ=1e9+7,N=5001; int tot,n,m,f[N][N],z[N],ls[N]; struct node{int to,next; }a[2*N]; void addl(int x,int y) {a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot; } void dp(int x,int fa) {for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa) continue;dp(y,x);int k=1;for(int j=1;j<=m;j++)f[x][j]=1ll*f[x][j]*((z[y]-f[y][j]+XJQ)%XJQ)%XJQ;}for(int j=1;j<=m;j++)(z[x]+=f[x][j])%=XJQ; } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int k,x;scanf("%d",&k);for(int j=1;j<=k;j++)scanf("%d",&x),f[i][x]=1;}for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dp(1,0);printf("%d",z[1]); }總結
以上是生活随笔為你收集整理的P3914-染色计数【树形dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博主称真我12月压轴登场:将背刺前面所有
- 下一篇: 富士康科技集团回应:“富士康被彻查,需补