BZOJ3742 : Painting

设f[i][j]表示以i为根的子树,i与父亲之间的边染成j的最小代价

DP的过程中转移时相当于求一个最小权匹配,用费用流即可

感觉复杂度飞起来了…

 

#include
const int inf=~0U>>2,N=30000,M=1000110,MAXN=160;
int n,x,y,i,j;
int u[M],v[M],c[M],co[M],nxt[M],t,S,T,l,r,q[M],g[N],f[N],d[N];bool in[N];
int G[MAXN],NXT[MAXN<<1],V[MAXN<<1],ed,dp[MAXN][MAXN];
inline void ADD(int x,int y){V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}
inline void add(int x,int y,int z,int zo){
  u[++t]=x;v[t]=y;c[t]=z;co[t]=zo;nxt[t]=g[x];g[x]=t;
  u[++t]=y;v[t]=x;c[t]=0;co[t]=-zo;nxt[t]=g[y];g[y]=t;
}
inline bool spfa(){
  int x,i;
  for(i=1;i<=T;i++)d[i]=inf;
  d[S]=0;in[S]=1;l=r=M>>1;q[l]=S;
  while(l<=r){
    int x=q[l++];
    if(x==T)continue;
    for(i=g[x];i;i=nxt[i])if(c[i]&&co[i]+d[x]

  

 

你可能感兴趣的:(BZOJ3742 : Painting)