2019.02.07 bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)
传送门
人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集。
思路:跟这题没啥变化好吗?再写一遍加深记忆吧。
就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间复杂度O(n+m)O(n+m)O(n+m)
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*w;
}
const int N=1e5+5,inf=1e9;
int n,m,a[N],dfn[N],low[N],fa[N],tot=0,f[N][2],g[N][2],top=0,q[N];
vector<int>e[N];
inline void solve(int rt,int x){
int tmp0=f[rt][0],tmp1=f[rt][1],tmp=x;
q[top=1]=x;
while(x!=rt)x=fa[x],q[++top]=x;
x=tmp;
g[x][0]=f[x][0],g[x][1]=-inf;
for(ri i=2;i<=top;++i){
g[q[i]][0]=f[q[i]][0]+max(g[q[i-1]][0],g[q[i-1]][1]);
g[q[i]][1]=f[q[i]][1]+g[q[i-1]][0];
}
tmp1=max(tmp1,g[rt][1]);
g[x][0]=f[x][0],g[x][1]=f[x][1];
for(ri i=2;i<=top;++i){
g[q[i]][0]=f[q[i]][0]+max(g[q[i-1]][0],g[q[i-1]][1]);
g[q[i]][1]=f[q[i]][1]+g[q[i-1]][0];
}
tmp0=max(tmp0,g[rt][0]);
f[rt][0]=tmp0,f[rt][1]=tmp1;
}
void tarjan(int p){
dfn[p]=low[p]=++tot,f[p][1]=a[p],f[p][0]=0;
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i])==fa[p])continue;
if(!dfn[v])fa[v]=p,tarjan(v),low[p]=min(low[p],low[v]);
else low[p]=min(low[p],low[v]);
if(dfn[p]<low[v])f[p][1]+=max(f[v][0],f[v][1]),f[p][1]+=f[v][0];
}
for(ri i=0,v;i<e[p].size();++i)if(fa[v=e[p][i]]!=p&&dfn[p]<dfn[v])solve(p,v);
}
int main(){
n=read(),m=read();
for(ri i=1,u,v;i<=m;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
for(ri i=1;i<=n;++i)a[i]=read();
return tarjan(1),cout<<max(f[1][0],f[1][1]),0;
}
2019.02.07 bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)的更多相关文章
- BZOJ1487 [HNOI2009]无归岛 【仙人掌dp】
题目链接 BZOJ1487 题解 就是一个简单的仙人掌最大权独立集 还是不会圆方树 老老实实地树形Dp + 环处理 #include<iostream> #include<cstdi ...
- bzoj1487 [HNOI2009]无归岛
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛 上的任意两个生物,他们有且仅有 ...
- 【BZOJ1487】[HNOI2009]无归岛(动态规划)
[BZOJ1487][HNOI2009]无归岛(动态规划) 题面 BZOJ 洛谷 题解 哪来的这么多废话啊,直接说一个仙人掌得了. 然后就是要你求仙人掌最大独立集了.(随便蒯份原来的代码就过了) 不过 ...
- P4410 [HNOI2009]无归岛
P4410 [HNOI2009]无归岛 显然这还是一个仙人掌图 对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友 要求求最大独立集,和树形dp一样,遇到环时单独提出来处理一下就好了 #inclu ...
- 2021.07.17 P3177 树上染色(树形DP)
2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...
- 2019.02.07 bzoj4784: [Zjoi2017]仙人掌(仙人掌+树形dp)
传送门 题意:给一个无向连通图,问给它加边形成仙人掌的方案数. 思路: 先考虑给一棵树加边形成仙人掌的方案数. 这个显然可以做树形dp. fif_ifi表示把iii为根的子树加边形成仙人掌的方案数. ...
- 【刷题】BZOJ 1487 [HNOI2009]无归岛
Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...
- 【题解】HNOI2009无归岛
这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环 ...
- [BZOJ4784][ZJOI2017]仙人掌(树形DP)
4784: [Zjoi2017]仙人掌 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 312 Solved: 181[Submit][Status] ...
随机推荐
- 筛素数 poj 2739
题目链接:https://vjudge.net/problem/POJ-2739 输入一个数字n,判断有没有一段连续的素数之和大于n,如果有,计算总共有几种. 思路:用素数筛法求出10000以内的素数 ...
- POJ-1458.CommonSubsequence.(DP:最长公共子序列裸题)
本题大意:给出两个字符串,让你求出最长公共子序列的长度并输出. 本题思路:本题是经典的DP问题,由于是两个字符串,那么我们就用一个二维数组来进行区分,用dp[ i ][ j ]来表示在s1和s2中分别 ...
- POJ-3414.Pots.(BFS + 路径打印)
这道题做了很长时间,一开始上课的时候手写代码,所以想到了很多细节,但是创客手打代码的时候由于疏忽又未将pair赋初值,导致一直输出错误,以后自己写代码可以专心一点,可能会在宿舍图书馆或者Myhome, ...
- Rxjs之创建操作符(Angular环境)
一 of操作符 import { Component, OnInit } from '@angular/core'; import { of } from 'rxjs/observable/of'; ...
- win静态库动态库
静态链接库: #include "..\lib.h" #pragma comment(lib,"..\\debug\\libTest.lib") //指定与静态 ...
- 脚手架搭建vue框架
一. node安装 1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v (检查一下 版本): 2)如果 执行结果显示: xx 不是内部命令,说明你还没有安装node , ...
- 【centos】centos中添加一个新用户,并授权
前言 有时候给root用户不太方便,新建一个用于并赋予权限这个做法相对好些 创建新用户 创建一个用户名为:cmj [root@localhost ~]# adduser cmj 为这个用户初始化密码, ...
- 先安装win7时IIS的安装
打开“控制面板”->选择“程序”->选择“打开或关闭windows功能”->在“Internet信息服务”中勾选以下勾选框
- DMZ原理与应用
DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓 ...
- sqlite 数据库错误 The database disk image is malformed database disk image
收银机上的sqlite数据库经常出现这种错误,错误的原因有可能是突然断电或是一些不规范操作导致的. 网上一般的做法有两种: 方法一: 1.在https://www.sqlite.org/downloa ...