题目大意:给一颗2500点的仙人掌,每个点可以染黑色,白色,不染色。同一条边两端点不能为黑白,求对于所有黑点个数的白点个数的最大值。
我直接想到了把他的dfs树建出来,直接dp节点x的儿子有y个黑点,当前染a,子树的返祖边染b的最大值。但是我以为他是O(n^3)的。但实际上他好像是O(n^2),然后就没有然后了。
//具体怎么推我真的不会,大概有这样的式子吧:T(n)=T(a)+T(n-a)+O(n*min(a,n-a)),反正平衡的二叉树是对的。。。
dp写的超长。。。
#include<bits/stdc++.h>
#define N 2505
using namespace std;
int n,m,x,y,dp[N][N][3][3],size[N],top[N],vis[N],fl[N],fa[N],dep[N];
int fst[N],to[N*4],nxt[N*4],l;
//dp[x] [y][a][b]
void link(int x,int y)
{
to[++l]=y;nxt[l]=fst[x];fst[x]=l;
to[++l]=x;nxt[l]=fst[y];fst[y]=l;
}
void upd(in