BZOJ3257 : 树的难题

设$f[x][i][j]$表示以$x$为根的子树,与$x$连通部分有$i$个黑点,$j$个白点,不联通部分都是均衡的最小代价。若$i>1$,则视作$1$;若$j>2$,则视作$2$。

然后进行树形DP即可,转移的时候如果不要那棵子树,那么那棵子树的状态必须满足$!i||j<2$。

时间复杂度$O(n)$。

 

#include
#define rep(i,n) for(int i=0;i='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void up(ll&a,ll b){if(a>b)a=b;}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline int fix(int x){return x<2?x:2;}
void dfs(int x,int y){
  rep(A,2)rep(B,3)f[x][A][B]=inf;
  f[x][0][0]=0;
  for(int i=g[x];i;i=nxt[i])if(v[i]!=y){
    int u=v[i];
    dfs(u,x);
    rep(A,2)rep(B,3)h[A][B]=inf;
    rep(A,2)rep(B,3)if(f[x][A][B]

  

你可能感兴趣的:(BZOJ3257 : 树的难题)