P4410 [HNOI2009]无归岛
显然这还是一个仙人掌图
对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友
要求求最大独立集,和树形dp一样,遇到环时单独提出来处理一下就好了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long LL;
const LL maxn=1e6;
const LL inf=0x3f3f3f3f;
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
struct node{
LL to,next;
}dis[maxn];
LL n,m,num,tot;
LL dp[maxn][2],fa[maxn],head[maxn],dfn[maxn],low[maxn],a[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]},head[u]=num;
}
inline void Dp(LL u,LL v){
LL sum0(0),sum1(0),sum2(0),sum3(0);
for(LL i=v;i!=u;i=fa[i]){
sum3=sum0+dp[i][1],
sum2=sum1+dp[i][0],
sum0=sum2,
sum1=max(sum2,sum3);
}
dp[u][0]+=sum1;
sum0=-inf,sum1=0;
for(LL i=v;i!=u;i=fa[i]){
sum3=sum0+dp[i][1],
sum2=sum1+dp[i][0],
sum0=sum2,
sum1=max(sum2,sum3);
}
dp[u][1]+=sum0;
}
void Tarjan(LL u){
low[u]=dfn[u]=++tot;
dp[u][1]=a[u];
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(!dfn[v])
fa[v]=u,
Tarjan(v),
low[u]=min(low[u],low[v]);
else if(v!=fa[u])
low[u]=min(low[u],dfn[v]);
if(dfn[u]<low[v])
dp[u][1]+=dp[v][0],
dp[u][0]+=max(dp[v][0],dp[v][1]);
}
for(LL i=head[u];i;i=dis[i].next){
LL v=dis[i].to;
if(fa[v]!=u&&dfn[u]<dfn[v])
Dp(u,v);
}
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=m;++i){
LL u=Read(),v=Read();
Add(u,v),Add(v,u);
}
for(LL i=1;i<=n;++i)
a[i]=Read();
Tarjan(1);
printf("%lld",max(dp[1][0],dp[1][1]));
return 0;
}
P4410 [HNOI2009]无归岛的更多相关文章
- 【BZOJ1487】[HNOI2009]无归岛(动态规划)
[BZOJ1487][HNOI2009]无归岛(动态规划) 题面 BZOJ 洛谷 题解 哪来的这么多废话啊,直接说一个仙人掌得了. 然后就是要你求仙人掌最大独立集了.(随便蒯份原来的代码就过了) 不过 ...
- bzoj1487 [HNOI2009]无归岛
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛 上的任意两个生物,他们有且仅有 ...
- 【刷题】BZOJ 1487 [HNOI2009]无归岛
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...
- [HNOI2009]无归岛
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...
- 【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)
题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 ...
- 2019.02.07 bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)
传送门 人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集. 思路:跟这题没啥变化好吗?再写一遍加深记忆吧. 就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间 ...
- 【题解】HNOI2009无归岛
这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环 ...
- Luogu-4410 [HNOI2009]无归岛
裸的仙人掌最大独立子集,结果一个zz的错误让我调了好久... \(-inf\)开始设为\(0x7fffffff\)结果\(A_i\)有负数一加就炸了 #include<cstdio> #i ...
- BZOJ1487 [HNOI2009]无归岛 【仙人掌dp】
题目链接 BZOJ1487 题解 就是一个简单的仙人掌最大权独立集 还是不会圆方树 老老实实地树形Dp + 环处理 #include<iostream> #include<cstdi ...
随机推荐
- 【转发】Java split()用法
特殊情况有 * ^ : | . \ 一.单个符号作为分隔符 String address="上海\上海市|闵行区\吴中路"; String[] splitAddress=addr ...
- Python之(scikit-learn)机器学习
一.机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或 ...
- 如何判断当前修改过的datatable的某一列值是否为int型或double类型
如何判断当前修改过的datatable的某一列值是否为int型或double类型 今天在做datatable数据验证时碰到要对datatable的列数据进行数据类型校验,因此记录一下本人校验的方法,如 ...
- CentOS 6.5 iptables原理详解以及功能说明
CentOS 6.5 iptables原理详解以及功能说明 来源 https://blog.51cto.com/tanxw/1389114 前言 iptables其实就是Linux下的一个开源的信息过 ...
- php中需要注意的函数(持续更新)
explode 函数 $a = null; explode("#",$a); //不会报错会返回一个只包含空字符串的数组
- iOS - The file “XXX.app” couldn’t be opened because you don’t have permission to view it.
当引入第三方的框架的时候 容易产生以下问题: The file “XXX.app” couldn’t be opened because you don’t have permission to vi ...
- win10重装系统修改信息
在安装win10系统之前要先进行ahci硬盘模式更改 ,以防止win10系统安装完成后出现蓝屏现象,那么如何进行ahci硬盘模式bios设置呢?今天我们就以映泰主板为大家介绍u盘装win10系统硬盘模 ...
- 使用angularJS设置复选框的回显状态
思路分析: 在angularJS中,我们可以使用ng-checked="expression()"来设置复选框的状态:当expression()返回true时,该复选框为选择中状态 ...
- php协议任意文件读取
php://filter/read=convert.base64-encode/resource=index.php
- STM8 定时器
中断映射表 对应stm8_interrupt.c #pragma vector=1 __interrupt void TRAP_IRQHandler(void) { } #pragma vector= ...