传送门

题意:给出一个仙人掌森林求其最大独立集。


思路:如果没有环可以用经典的树形dpdpdp解决。

fi,0/1f_{i,0/1}fi,0/1​表示第iii个点不选/选的最大独立集。

然后fi,0+=max{fv,0,fv,1},fi,1+=fv,0f_{i,0}+=max\{f_{v,0},f_{v,1}\},f_{i,1}+=f_{v,0}fi,0​+=max{fv,0​,fv,1​},fi,1​+=fv,0​转移即可。

现在有了环考虑把每个环单独提出来更新一下。

就用个队列把整个环记录下来然后分这个环在原图中dfsdfsdfs出来的最高点选与不选分别dpdpdp更新即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
const int N=5e4+5;
int n,m,ans=0,fa[N],dfn[N],low[N],tot=0,f[N][2],g[N][2],q[N],top;
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]=-0x3f3f3f3f;
	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]=1;
	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][0]+=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)if(!dfn[i])tarjan(i),ans+=max(f[i][0],f[i][1]);
	cout<<ans;
	return 0;
}

2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)的更多相关文章

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

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

  2. BZOJ 4316: 小C的独立集 仙人掌 + 树形DP

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...

  3. [BZOJ4316]小C的独立集 仙人掌?

    题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...

  4. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  5. bzoj4316: 小C的独立集

    Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...

  6. 2018.07.22哨戒炮 II(树形dp)

    哨戒炮 II 描述 你的防线成功升级,从原来的一根线变成了一棵树.这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道.你要选择一些炮台安装哨戒炮.在第 i 个炮台上安装哨戒炮得到的防御力为 vi ...

  7. 小奇的仓库(树形DP)

    「题目背景」 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 「问题描述」 喵星系有n个星球,星球以及星球间的航线形成一棵树. 从星球a到星球b ...

  8. BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】

    题目 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要花费,之后每点亮4 ...

  9. [BZOJ4316]小C的独立集(圆方树DP)

    题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的 ...

随机推荐

  1. Android 基础 (四大组件,五大存储,六大布局)

    Android四大组件: 参考:https://blog.csdn.net/shenggaofei/article/details/52450668 Android四大组件分别为activity.se ...

  2. TOJ4439微积分――曲线积分(数学,模拟)

    传送门:点我 格林公式P,Q为关于x,y的函数. 现在为了方便起见,现给出x的积分上限1,积分下限0, y的积分上限x,积分下限0. P只是关于Y的函数,Q只是关于X的函数. 输入 开始输入为测试组数 ...

  3. ActiveMQ之HelloWorld

    JMS实现JMS接口的消息中间件 Provider:生产者 Consumer:消费者 PTP:Point to Point:点对点的消息模型 Pub/Sub:Publish/Subscribe:发布订 ...

  4. 专项测试——移动app安装包检测

    一.背景和现状 安装包的重要性无需多提,针对安装包质量控制越来越严格和规范,包括证书.文件大小.安装成功率等,APP的证书及混淆是影响APP的安装成功率及代码安全性的很大因素,随着功能迭代,安装包也会 ...

  5. jq里面关于disable的用法

    //两种方法设置disabled属性$('#areaSelect').attr("disabled",true);$('#areaSelect').attr("disab ...

  6. 如何在Oracle中 查询一个表被其他数据库对象引用[z]

    这两天老大让我再oracle中把要替换的表被其他对象引用之处找出来,整理一份表,接到这个任务,我是一脸懵逼,怎么找?大海捞针么?问同事.查资料,自己研究,最后整理一下仅供大家参考,同时以备将来回顾.本 ...

  7. Win10以管理员身份启动cmd.exe

    PowerShell -windowstyle hidden -Command "Start-Process cmd.exe -ArgumentList '/s,/k, pushd' -Ve ...

  8. react-router4 第一篇

    无奈,英语4级没过,只能靠猜了.. 首先就是安装了 npm install --save-dev react npm install --save-dev react-dom npm install ...

  9. 使用vim编程步骤

    先用vim 名字.cpp //创建一个.cpp文件进行代码编写 可以调用g++ 名字.cpp的形式进行编译,更好的方法是采用CMakeLists.txt touch CMakeLists.txt // ...

  10. PAT 甲级 1019 General Palindromic Number(20)(测试点分析)

    1019 General Palindromic Number(20 分) A number that will be the same when it is written forwards or ...