摘要: 思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边。那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态dp[u][j]=min(dp[u][j],dp[u][j-son[v]]+1);//切断与子节点相连的边对于子节点dp[v][n-son[v]]=1;dp[v][j]=min(dp[v][j],dp[v][j-n+son[v]]+1)//表示不需要由父节点过来的那条分支最有从所有状态中选举最优的dp[i][n-p];#include#include#include#include#include#include#inc 阅读全文
posted @ 2013-09-01 19:50 fangguo 阅读(143) 评论(0) 推荐(0) 编辑
摘要: #include#include#include#include#include#include#include#include#include#include#include#define Maxn 100010#define Maxm 200010#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x que[Maxn];void init(){ memset(head,-1,sizeof(head)); memset(vi,0,sizeof(vi)); memset(vis,0,sizeof... 阅读全文
posted @ 2013-09-01 15:37 fangguo 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 思路:我以前一直喜欢用根号n分段的LCA。在这题上挂了,第一次发现这样的LCA被卡。果断改用Tarjan离线算法求LCA。当前节点为u,其子节点为v。那么:当以v根的子树中含有连接子树以外点的边数为out[v]。out[v]==0,dp[u]+=m;out[v]==1,dp[u]+=1;else dp[u]+=0;最后就是dp[u]+=dp[v]。对于u点的out[u]+=out[v];最后out[u]-=cnt[u];cnt[u]表示以u为根,在子树内的边数。#include#include#include#include#include#include#include#include#in 阅读全文
posted @ 2013-09-01 15:34 fangguo 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 虚拟一个根节点n,设其值为0.并且始终保持其为根。#include#include#include#include#include#include#include#include#include#include#include#define Maxn 40010#define Maxm 100010#define LL __int64#define Abs(x) ((x)>0?(x):(-x))#define lson(x) (x num;void init(){ for(int i=0;i<Maxn;i++){ fa[i]=i; val[i]=0; }... 阅读全文
posted @ 2013-09-01 10:34 fangguo 阅读(185) 评论(0) 推荐(0) 编辑