【BZOJ1487】[HNOI2009]无归岛(动态规划)

题面

BZOJ

洛谷

题解

哪来的这么多废话啊,直接说一个仙人掌得了。

然后就是要你求仙人掌最大独立集了。(随便蒯份原来的代码就过了)

不过我还是重新整理一遍思路吧。

一种是裸的\(dp\),只需要额外考虑上环的影响就好了。

这种方法我们从树上的做法推广过来。

先考虑树的最大独立集,设\(f[i][0/1]\)表示当前考虑\(i\)及其子树,这个点一定不选,以及随意的最大独立集。转移的时候枚举这个点选还是不选即可。

推广到仙人掌上,相比于树,还多出来一条返祖边。所以额外维护一维\(0/1\),表示这条边所在的环的最底下的那个端点是否被选。分情况讨论转移即可,详细的解法戳这里

另外一种方法基于圆方树的思想。我们假装构建出来了圆方树(事实上不会构建出来的,只是利用了这个形式)。对于环而言,我们可以单独把环扣下来,显然除了环之外挂的子树对于这个环上的点是否选择是无关的。状态和树上的\(dp\)一样的设计。转移的时候这样子:如果这条边是一条树边,那么我们直接转移就好了,就把他当成一棵树来做。否则是一条返祖边,那么我们单独考虑这个环的贡献。现在的形式就是环上挂着一串的子树,子树内的答案我们已知,那么从一个方向开始遍历整个环,记录一下这个点选还是没有选的最大贡献,显然最终这个环的贡献只需要合并到深度最浅的那个点上面就可以了。那么枚举这个深度最浅的点是选还是不选,直接贪心抉择一下即可。更加具体的戳这里

代码一:直接\(dp\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 100100
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX*3];
int h[MAX],cnt=1,n,m;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dep[MAX],fa[MAX],a[MAX];
int tp[MAX],un[MAX];
void dfs(int u,int ff)
{
fa[u]=ff;dep[u]=dep[ff]+1;
for(int i=h[u];i;i=e[i].next)
if(!dep[e[i].v])dfs(e[i].v,u);
}
void jump(int u,int v){int x=v;while(x!=u)tp[x]=u,un[x]=v,x=fa[x];}
int f0[MAX],f1[MAX],g0[MAX],g1[MAX];
void dp(int u)
{
f1[u]=a[u];
if(u!=un[u])g1[u]=a[u];
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(dep[u]+1!=dep[v])continue;
dp(v);
if(un[u]!=un[v])g0[u]+=f1[v],g1[u]+=g0[v];
else g0[u]+=g1[v],g1[u]+=g0[v];
if(tp[v]!=u)f0[u]+=f1[v],f1[u]+=f0[v];
else f0[u]+=f1[v],f1[u]+=g0[v];
}
f1[u]=max(f1[u],f0[u]);
g1[u]=max(g1[u],g0[u]);
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=1;i<=n;++i)a[i]=read();
dfs(1,0);
for(int u=1;u<=n;++u)
for(int i=h[u];i;i=e[i].next)
if(dep[u]<dep[e[i].v]&&fa[e[i].v]!=u)
jump(u,e[i].v);
dp(1);
printf("%d\n",f1[1]);
return 0;
}

类似圆方树的思想的做法:

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<2];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n,m,a[MAX];
int dfn[MAX],low[MAX],tim,f[MAX][2],fa[MAX];
void dp(int u,int y)
{
int f0=0,f1=0,t0,t1;
for(int i=y;i!=u;i=fa[i])
{
t0=f0+f[i][0];t1=f1+f[i][1];
f0=max(t0,t1);f1=t0;
}
f[u][0]+=f0;
f0=0;f1=-1e9;
for(int i=y;i!=u;i=fa[i])
{
t0=f0+f[i][0];t1=f1+f[i][1];
f0=max(t0,t1);f1=t0;
}
f[u][1]+=f1;
}
void Tarjan(int u,int ff)
{
dfn[u]=low[u]=++tim;fa[u]=ff;f[u][1]=a[u];
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(!dfn[v])Tarjan(v,u),low[u]=min(low[u],low[v]);
else if(v!=ff)low[u]=min(low[u],dfn[v]);
if(low[v]>dfn[u])
f[u][0]+=max(f[v][0],f[v][1]),f[u][1]+=f[v][0];
}
for(int i=h[u];i;i=e[i].next)
if(fa[e[i].v]!=u&&dfn[u]<dfn[e[i].v])
dp(u,e[i].v);
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=1;i<=n;++i)a[i]=read();
Tarjan(1,0);
printf("%d\n",max(f[1][0],f[1][1]));
return 0;
}

【BZOJ1487】[HNOI2009]无归岛(动态规划)的更多相关文章

  1. bzoj1487 [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛 上的任意两个生物,他们有且仅有 ...

  2. BZOJ1487 [HNOI2009]无归岛 【仙人掌dp】

    题目链接 BZOJ1487 题解 就是一个简单的仙人掌最大权独立集 还是不会圆方树 老老实实地树形Dp + 环处理 #include<iostream> #include<cstdi ...

  3. 2019.02.07 bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)

    传送门 人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集. 思路:跟这题没啥变化好吗?再写一遍加深记忆吧. 就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间 ...

  4. P4410 [HNOI2009]无归岛

    P4410 [HNOI2009]无归岛 显然这还是一个仙人掌图 对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友 要求求最大独立集,和树形dp一样,遇到环时单独提出来处理一下就好了 #inclu ...

  5. 【刷题】BZOJ 1487 [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...

  6. 【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)

    题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 ...

  7. [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...

  8. 【题解】HNOI2009无归岛

    这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环 ...

  9. Luogu-4410 [HNOI2009]无归岛

    裸的仙人掌最大独立子集,结果一个zz的错误让我调了好久... \(-inf\)开始设为\(0x7fffffff\)结果\(A_i\)有负数一加就炸了 #include<cstdio> #i ...

随机推荐

  1. Ubuntu系统上双节点部署OpenStack

    安装和部署双节点OpenStack 介绍: 1.宿主机:Win10操作系统 2.在VMware下创建两台虚拟机: devstack-controller:控制节点 + 网络节点 + 块存储节点 + 计 ...

  2. HBase启动时报错:/bin/java: No such file or directory6/bin/../bin/hbase: line 412: /usr/local/jdk1.8.0_152/bin/java

    今天在启动HBase时发现如下错误:/bin/java: No such file or directory6/bin/../bin/hbase: line 412: /usr/local/jdk1. ...

  3. Maltego——互联网情报聚合工具初探(转)

    有时候你可曾想过,从一个Email,或者Twitter,或是网站,甚至姓名等等,能找到一个人千丝万缕的联系,并把这些联系整合,利用起来?Maltego就是这样一款优秀而强大的工具.Maltego允许从 ...

  4. 20155305《网络对抗》Web基础

    20155305<网络对抗>Web基础 实验过程 Web前端:HTML 使用netstat -aptn查看80端口是否被占用(上次实验设置为Apache使用80端口),如果被占用了就kil ...

  5. 20155320 Exp6 信息搜集与漏洞扫描

    20155320 Exp6 信息搜集与漏洞扫描 [实验后回答问题] (1)哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管 ...

  6. linux下使用软连接之案例二

           在笔者的上一篇文章介绍过怎么通过linux的软连接在不修改上传代码的情况下,将上传到项目路径下的图片改为上传到项目外面,防止重新部署后图片被删除了.同时还可以直接通过类似访问静态资源的方 ...

  7. WPF后台线程更新UI

    0.讲点废话 最近在做一个文件搜索的小软件,当文件多时,界面会出现假死的状况,于是乎想到另外开一个后台线程,更新界面上的ListView,但是却出现我下面的问题. 1.后台线程问题 2年前写过一个软件 ...

  8. 《无所不能的JavaScript编程系列:setTimeout 简笔》

    前言:问题引出 JavaScript中会经常用到setTimeout来推迟一个函数的执行,如: setTimeout(function(){alert("Hello World") ...

  9. PAT甲题题解-1005. Spell It Right (20)-数位求和,水

    把每个位上的数字求和sum,然后以英文单词的形式输出sum的每个位 #include <iostream> #include <cstdio> #include <alg ...

  10. PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789810.html特别不喜欢那些随便转载别人的原创文章又不给 ...