[luogu3155 CQOI2009] 葉子的染色(樹形dp)
阿新 • • 發佈:2018-10-12
sin mes 樹形dp tor print pac problem 傳送門 並不會
傳送門
Solution
十分簡單的樹形dpQwQ,轉移關系:父親染了兒子不用染
只需要確定根就是簡單樹形dp,而其實根可以隨便取一個非葉子節點
可以分情況討論發現答案並不會改變
Code
//By Menteur_Hxy #include <cmath> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define Re register #define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++) #define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();} while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar(); return x*f; } const int N=1e4+10,INF=0x3f3f3f3f; int n,m; int f[N][2],col[N]; vector <int> V[N]; void dfs(int u,int pre) { f[u][0]=f[u][1]=1; if(u<=m) f[u][!col[u]]=INF; int siz=V[u].size(),v; Fo(i,0,siz-1) if((v=V[u][i])!=pre) { dfs(v,u); f[u][1]+=min(f[v][1]-1,f[v][0]); f[u][0]+=min(f[v][0]-1,f[v][1]); } } int main() { n=read(),m=read();//因習慣n,m互換 Fo(i,1,m) col[i]=read(); Fo(i,1,n-1) { int a=read(),b=read(); V[a].push_back(b); V[b].push_back(a); } dfs(m+1,0); printf("%d",min(f[m+1][0],f[m+1][1])); return 0; }
[luogu3155 CQOI2009] 葉子的染色(樹形dp)