博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)
阅读量:5861 次
发布时间:2019-06-19

本文共 1607 字,大约阅读时间需要 5 分钟。

Description

BZOJ只是扔了个下载

Solution

设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块。

设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块。

转移非常明显。处理出每个情况的上下界之后差分一下$O(1)$回答询问即可。

卡空间所以要用$short$。 第二次$INF$开大了……应该多上点心了……

Code

1 #include
2 #include
3 #include
4 #define N (5009) 5 using namespace std; 6 7 struct Edge{
int to,next;}edge[N<<1]; 8 int n,u,v,T,q,INF=1e4,size[N],b[N]; 9 short f[N][N],g[N][N],tmpf[N],tmpg[N],ans[N][N];10 int head[N],num_edge;11 12 void add(int u,int v)13 {14 edge[++num_edge].to=v;15 edge[num_edge].next=head[u];16 head[u]=num_edge;17 }18 19 void Dfs(int x,int fa)20 {21 size[x]=1;22 for (int i=0; i<=n; ++i)23 f[x][i]=INF,g[x][i]=-INF;24 f[x][b[x]]=g[x][b[x]]=1;25 for (int i=head[x]; i; i=edge[i].next)26 if (edge[i].to!=fa)27 {28 int to=edge[i].to;29 Dfs(to,x);30 for (int j=0; j<=size[x]+size[to]; ++j)31 tmpf[j]=INF,tmpg[j]=-INF;32 for (int j=0; j<=size[x]; ++j)33 for (int k=0; k<=size[to]; ++k)34 {35 tmpf[j+k]=min((int)tmpf[j+k],(int)f[x][j]+f[to][k]);36 tmpg[j+k]=max((int)tmpg[j+k],(int)g[x][j]+g[to][k]);37 }38 size[x]+=size[to];39 for (int j=0; j<=size[x]; ++j)40 {41 f[x][j]=min(f[x][j],tmpf[j]);42 g[x][j]=max(g[x][j],tmpg[j]);43 }44 }45 for (int i=0; i<=size[x]; ++i)46 if (f[x][i]

转载于:https://www.cnblogs.com/refun/p/9775176.html

你可能感兴趣的文章
对RTMP视频流进行BitmapData.draw()出错的解决办法
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
Vertica的这些事&lt;十&gt;—— vertica中group by 和join 语句的优化
查看>>
Spark修炼之道(基础篇)——Linux大数据开发基础:第九节:Shell编程入门(一)...
查看>>
MySQL中如何启用InnoDB数据引擎
查看>>
Duplicate Symbol链接错误的原因总结和解决方法[转]
查看>>
适配器模式
查看>>
刨根问底区块链 —— 基础篇
查看>>
php 直接调用svn命令
查看>>
建立低权限的ftp帐号
查看>>
htpasswd
查看>>
Android窗口机制(三)Window和WindowManager的创建与Activity
查看>>
Android 编译出错解决
查看>>
iOS--The request was denied by service delegate (SBMainWorkspace) for reason:
查看>>
Android 打开WIFI并快速获取WIFI的信息
查看>>
Spring boot 入门篇
查看>>
【IOS开发】GDataXML解析XML
查看>>
Iptables
查看>>
我的友情链接
查看>>
Flaapy Bird项目笔记
查看>>