【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 57 Solved: 41
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
2 3
3 1
3 4
4 5
3 5
Sample Output
HINT
Source
Solution
作为切SDOI2010Area的铺垫
仙人掌DP求 最大独立集
最大独立集:感性的描述就是,一个图中,相邻点不能同时选,选出来最(多/点权总和最大)的点集
对于一般图,往往采用 转化成补图 求 最大团
但基于 树 和 仙人掌 可以利用DP求解 (树形DP求最大独立集,详见 CodeVS1380没有上司的舞会)
至于仙人掌,就是树+基环,且强连通(描述简陋,垃圾),详见下:

仙人掌DP的话,与树形DP同理,对于树边,可以直接进行树形DP,对于环,考虑单独处理,即单独DP,DP方式和树形DP一样
dp[x][0/1]表示 (选/不选)X节点的最优答案
转移显而易见,至于对环的考虑方法,可以采用Tarjan求强连通分量的思路,利用low和dfn进行判断 更多详见 某论文
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 100010
struct EdgeNode{int next,to;}edge[maxn<<];
int head[maxn],cnt;
void add(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
void insert(int u,int v) {add(u,v); add(v,u);}
int n,m,ans,tot;
int dp1[maxn][],dp2[maxn][],ring[maxn],fa[maxn],dfn[maxn],low[maxn],t,deep[maxn];
void CactusDP(int st,int tt)
{
ring[]=st; ring[]=tt; int zz=;
while (ring[zz]!=st) {ring[zz+]=fa[ring[zz]]; zz++;}
dp2[][]=dp2[][]=;
for (int i=; i<=zz; i++)
dp2[i][]=dp2[i-][]+dp1[ring[i]][],
dp2[i][]=max(dp2[i-][],dp2[i-][])+dp1[ring[i]][];
int tmp=dp2[zz][];
dp2[][]=-0x7fffffff;
for (int i=; i<=zz; i++)
dp2[i][]=dp2[i-][]+dp1[ring[i]][],
dp2[i][]=max(dp2[i-][],dp2[i-][])+dp1[ring[i]][];
dp1[st][]=tmp; dp1[st][]=dp2[zz][];
}
void TreeDP(int now)
{
dfn[now]=low[now]=++t;
dp1[now][]=; dp1[now][]=;
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].to!=fa[now])
{
if (deep[edge[i].to]) {low[now]=min(dfn[edge[i].to],low[now]); continue;}
fa[edge[i].to]=now;
deep[edge[i].to]=deep[now]+;
TreeDP(edge[i].to);
if (low[edge[i].to]>dfn[now])
dp1[now][]+=dp1[edge[i].to][],dp1[now][]+=max(dp1[edge[i].to][],dp1[edge[i].to][]);
low[now]=min(low[now],low[edge[i].to]);
}
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].to!=fa[now] && low[edge[i].to]==dfn[now] && deep[edge[i].to]!=deep[now]+)
CactusDP(now,edge[i].to);
}
int main()
{
n=read(),m=read();
for (int u,v,i=; i<=m; i++) u=read(),v=read(),insert(u,v);
for (int i=; i<=n; i++)
if (!dfn[i]) {deep[i]=; fa[i]=i; TreeDP(i); ans+=max(dp1[i][],dp1[i][]);}//为了防止出现仙人掌森林的情况QAQ
printf("%d\n",ans);
return ;
}
【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集的更多相关文章
- BZOJ.4316.小C的独立集(仙人掌 DP)
题目链接 \(Description\) 求一棵仙人掌的最大独立集. \(Solution\) 如果是树,那么 \(f[i][0/1]\) 表示当前点不取/取的最大独立集大小,直接DP即可,即 \(f ...
- BZOJ 4316: 小C的独立集 仙人掌 + 树形DP
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...
- BZOJ 4316: 小C的独立集 解题报告
4316: 小C的独立集 Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点, ...
- BZOJ 4316: 小C的独立集
4316: 小C的独立集 思路:先将树上的转移做好.然后环上的转移就是强制最上面的的点选或者不选,然后在环上跑一遍转移就可以了. 代码: #pragma GCC optimize(2) #pragma ...
- bzoj 4316: 小C的独立集【仙人掌dp】
参考:https://www.cnblogs.com/clrs97/p/7518696.html 其实和圆方树没什么关系 设f[i][j][k]为i点选/不选,这个环的底选不选 这个底的定义是设u为这 ...
- 【刷题】BZOJ 4316 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- 【BZOJ】4316: 小C的独立集 静态仙人掌
[题意]给定仙人掌图,求最大独立集(选择最大的点集使得点间无连边).n<=50000,m<=60000. [算法]DFS处理仙人掌图 [题解]参考:[BZOJ]1023: [SHOI200 ...
- bzoj 5072 小A的树 —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 由于对于一个子树,固定有 j 个黑点,连通块大小是一个连续的范围: 所以记 f[i][ ...
- [BZOJ4316]小C的独立集 仙人掌?
题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...
随机推荐
- vim一些常用的快捷键
快速注释: Ctrl+v I // esc 打开文件 gf ctrl+o
- ATI显卡添加自定义分辨率
run regedit, 浏览到这个键目录下 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video 先导出一个作为备份. 查找 DALNo ...
- 在PHP中无法连接Memcached的解决办法
Memcached 已经正确安装配置, 并且防火墙也已经打开了本机对自己所有端口的访问, telnet localhost 11211也正常, 但是通过PHP访问出现 [Sat May 17 22:0 ...
- JavaScript中的this关键字
在JavaScript中,函数的this关键字的行为与其他语言相比有很多不同.在JavaScript的严格模式和非严格模式下也略有区别. 在绝大多数情况下,函数的调用方式决定了this的值.this不 ...
- 前端面试——css篇
css盒子模型 在W3C模型中: 总宽度 = margin-left + border-left + padding-left + width + padding-right + border-rig ...
- single-write-database-connection
http://ithare.com/ultimate-db-heresy-single-db-connection-part-i-performance-part-ii-scalability-to- ...
- 用opencv的traincascade训练检测器
#1,准备正负样本 正样本:可以一张图片上多个sample,也可以一张图片单独成一个sample,准备多个sample.生成描述文件如下所示: 负样本:只要不含正样本,任意图片都可以作为负样本,但是最 ...
- 线程本地变量ThreadLocal源码解读
一.ThreadLocal基础知识 原始线程现状: 按照传统经验,如果某个对象是非线程安全的,在多线程环境下,对对象的访问必须采用synchronized进行线程同步.但是Spring中的各种模板 ...
- Tomcat 内存溢出对应解决方式
1.Tomcat内存溢出的原因 生产环境中Tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三 ...
- 使用 data-* 属性来嵌入自定义数据
1. HTML 实例 <ul> <li data-animal-type="bird">Owl</li> <li data-animal- ...