【BZOJ4316】小C的独立集(动态规划)
【BZOJ4316】小C的独立集(动态规划)
题面
题解
考虑树的独立集求法
设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值
转移\(f[u][0]=\sum f[v][1]\),\(f[u][1]=\sum f[v][0]\),\(f[u][1]=max(f[u][1],f[u][0])\)
现在放在了仙人掌上,
我们可以看做一棵树加上了若干不相交的返祖边
于是再加上一维\(f[u][0/1][0/1]\)
其中最后一维表示这条边所在的环的最底端的那个点一定不选,或者无所谓
赋初值:\(f[u][1][1]=1\),如果这个点不是所在环的最底端,\(f[u][1][0]=1\)
此时的转移:
1.两个点的底端点相同
这个时候我们先只考虑强制不选底端的转移
那么,\(f[u][1][0]+=f[v][1][1],f[u][1][1]+=f[v][1][0]\)
也就是上面裸的在树上的转移
2.两个点的底端点不同
既然跨越了环,意味着\(u\)就是这个环的底端点,\(v\)是它所在环的顶端点
那么,可以\(u\)选\(v\)不选,因为跨越了环,所以对于\(v\)的底端点选择与否我们是不关心的
而第二维的\(1\)表示的\(u\)无所谓,后面的\(0\)则是强制不选择\(u\)
因此\(f[u][0][0]+=f[v][1][1]\),\(f[u][1][0]+=f[v][0][0]\)
3.\(v\)的顶端点不是\(u\)
意味着不用担心底端点产生的影响
所以\(f[u][0][1]+=f[v][1][1]\),\(f[u][1][1]+=f[v][0][1]\)
4.\(v\)的顶端点是\(u\)
此时要考虑底端点的贡献了
此时当前\(u\)不选,那就没有什么问题\(f[u][0][1]+=f[v][1][1]\)
当前\(u\)选择,强制不能选择底端点\(f[u][1][1]+=f[v][0][0]\)
好了,这样就讨论完了四种转移,然后就可以啦
#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 55555
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];
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]=1;
if(u!=un[u])g1[u]=1;
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);
}
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;
}
【BZOJ4316】小C的独立集(动态规划)的更多相关文章
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- [BZOJ4316]小C的独立集(圆方树DP)
题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的 ...
- BZOJ4316 小C的独立集 【仙人掌】
题目 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多. ...
- 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)
传送门 题意:给出一个仙人掌森林求其最大独立集. 思路:如果没有环可以用经典的树形dpdpdp解决. fi,0/1f_{i,0/1}fi,0/1表示第iii个点不选/选的最大独立集. 然后fi,0+ ...
- 【题解】Bzoj4316小C的独立集
决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...
- [BZOJ4316]小C的独立集 仙人掌?
题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...
- bzoj4316小C的独立集(dfs树/仙人掌+DP)
本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...
- 【BZOJ4316】小C的独立集(仙人掌,动态规划)
[BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 57 Solved: 41[Submit][Status][Discuss] ...
随机推荐
- Day2 Numerical simulation of optical wave propagation之标量衍射理论基本原理(二)
2.麦克斯韦方程组的简单行波解 讨论通过线性.各向同性.均匀.无色散.无限电荷和电流的电介质材料的光波传输.在这种情况下,介质具有如下属性: (1)推导获得波动方程( 由麦克斯韦方程组导出的.描述电磁 ...
- 阿里云服务器使用镜像市场上的环境以后sql不能远程问题
关于阿里云的服务器,首先要说的就是买了以后是没有环境的,什么都需要自己配置,也是在这个上面栽了很多跟头最后去的镜像市场买的一个IIS8+SQL2016的asp.net环境 怎么说呢,感觉有些问题的本源 ...
- 关于js作用域问题
补充: function Foo(name,age){ this.name=name; this.age=age; this.getName=function(){ console.log(this) ...
- Java面试题详解二:java中的关键字
一,final1.被final修饰的类不可以被继承2.被final修饰的方法不可以被重写3.被final修饰的变量不可以被改变 重点就是第三句.被final修饰的变量不可以被改变,什么不可以被改变呢 ...
- 07-nodejs中npm的使用
NPM是什么? 简单的说,npm就是JavaScript的包管理工具.类似Java语法中的maven,gradle,python中的pip. 安装 傻瓜式的安装. 第一步:打开https://node ...
- JEECG 单点登录 SSO
jeecg中用户登录的唯一性-CSDN问答https://ask.csdn.net/questions/656639 JEECG 集成KiSSO单点登录实现统一身份认证 - zhangdaiscott ...
- 墨者学院——密码学加解密实训(Base64转义)
地址:https://www.mozhe.cn/bug/detail/SW5ObnVFa05vSHlmTi9pcWhRSjRqZz09bW96aGUmozhe 在靶场中找到内容 解密 访问直接得key
- babel (三) babel polly-fill
Babel includes a polyfill that includes a custom regenerator runtime and core-js. This will emulate ...
- Azure系列2.1.12 —— CloudBlobDirectory
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674 ...