[Topic link]
https://www.lydsy.com/JudgeOnline/problem.php?id=5141
Algorithm
Tree-shaped DP
Time complexity: O (N)
Code
#include <bits/stdc++.h>using namespaceStd;typedefLong LongLL;Const intMAXN = 1e5 +Ten;Const intMAXC =5; Const intP = 1e9 +7;structedge{intto, NXT;} E[MAXN<<1];intN, k, tot;intCOLOR[MAXN], HEAD[MAXN]; LL f[maxn][maxc];template<typename t> InlinevoidChkmax (T &x,t y) {x =Max (x, y);} Template<typename t> InlinevoidChkmin (T &x,t y) {x =min (x, y);} Template<typename t> InlinevoidRead (T &x) {T F=1; x =0; Charc =GetChar (); for(;!isdigit (c); c = GetChar ())if(c = ='-') F =-F; for(; IsDigit (c); c = GetChar ()) x = (x <<3) + (x <<1) + C-'0'; X*=F;} Template<typename t> InlinevoidUpdate (T &x,t y) {x+=y; X%=P;} Template<typename t> InlinevoidMul (T &x,t y) {x= x *y; X%=P;} InlinevoidAddedge (intUintv) {Tot++; E[tot]=(Edge) {V, head[u]}; Head[u]=tot;} Inline LL dp (intU,intKintFA) { if(F[u][k]! =-1)returnF[u][k]; F[U][K]=1; for(inti = Head[u]; I i =e[i].nxt) { intv =e[i].to; if(v = = FA)Continue; if(Color[v]) {if(Color[v] = =k)returnF[U][K] =0; ElseMul (F[u][k], DP (V, color[v], u)); } Else{LL value=0; for(intj =1; J <=3; J + +) if(J! =k) Update (value, DP (V, J, u)); Mul (F[u][k], value); } } returnf[u][k];}intMain () {read (n); read (k); for(inti =1; I < n; i++) { intx, y; Read (x); Read (y); Addedge (x, y); Addedge (y, x); } for(inti =1; I <= K; i++) { intB, C; Read (b); Read (c); COLOR[B]=C; } for(inti =1; I <= N; i++) f[i][1] = f[i][2] = f[i][3] = -1; if(color[1]) {printf ("%lld\n", DP (1, color[1] , -1)); } Else{LL ans=0; for(inti =1; I <=3; i++) Update (ANS, DP (1, I,-1)); printf ("%lld\n", ans); } return 0;}
[Usaco 2017DEC] Barn Painting