传送门

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


思路:如果没有环可以用经典的树形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. 江西财经大学第一届程序设计竞赛 F题 解方程

    链接:https://www.nowcoder.com/acm/contest/115/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  2. TOJ 3151: H1N1's Problem(欧拉降幂)

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3151 时间限制(普通/Java): ...

  3. Mac下Chrome浏览器的手机模拟器,开启模拟定位

    项目接入百度地图,浏览器调试时需要获取定位信息. 1 打开设置->高级->内容设置->位置,将定位设置为“使用前先询问”,并清空禁止列表. 2 审查元素->Network-&g ...

  4. redis 简介,安装与部署

    NOSQL简介 NoSQL,泛指非关系型的数据库,NoSQL数据库的四大分类: 键值(Key-Value)存储数据库:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据 ...

  5. vue 添加子路由,并对路由重定向

    // 用户信息首页 { path: '/user/index', name: 'userIndex', component: userIndex, redirect: '/user/index/sho ...

  6. Mac下JDK、Maven、Tomcat、Git开发安装及环境变量配置

    本文主要内容: - 1.Mac OS 10.11.6 [OS X EL Captain] - 2.Mac OS 安装Java 设置环境变量 - 3.Mac OS 安装Maven设置环境变量 - 4.M ...

  7. a file was not found

    除了权限问题 还有可能是vm的字符串长度超出限制

  8. SSH异常“Failed to start OpenSSH Server daemon”

    [root@bogon yum]# systemctl status sshd.service● sshd.service - OpenSSH server daemon   Loaded: load ...

  9. 比特币测试网络搭建以及RPC服务开启-配置注意事项

    .bitcoin QA Test环境 启动指定参数: "C:\Program Files (x86)\Bitcoin\bitcoin-qt.exe" -testnet -serve ...

  10. STL set,mulityset用法

    #include<iostream> #include <set> using namespace std; template <class T> class Ru ...