【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 ...
随机推荐
- PHP程序设计
① 在设计评论系统时,关于文章的一些属性,我们最好存放在一个内存缓存中,通过下面的设计每次仅需要查询一次即可获取文章的所有属性 class CommentsDoc{ private static $d ...
- AFNetworking 基本使用
AFNetwork是一个轻量级的网络请求api类库.是以NSURLConnection, NSOperation和其他方法为基础的. 下面这个例子是用来处理json请求的 3如何选择AFNetwork ...
- Debian 8(Jessie) 安装自带Mysql
执行命令 sudo apt-get install mysql-server 这会把mysql-client也装上, 版本都是5.5. 安装过程中会提示你输入两遍root口令. 用ps aux|gre ...
- DEDECMS之二 如何修改模板页
使用织梦系统最经常是为了仿站,那么模板应该怎么改? 这里主要谈谈关于比较常用的几个模板页 网站主页.列表页.内容页.栏目的调用 1.主页模板 常用组合方法:index.htm + head.htm + ...
- 搜索引擎关键词劫持之asp篇
摘要:关键词劫持(黑帽seo)其实原理很简单:搜索引擎关键词劫持的过程实际上就是,修改肉鸡站点(webshell站点)A的首页(希望被搜索引擎收录的页面,一般情况下是首页),使之做出判断... 黑帽S ...
- python中from module import * 的一个陷阱
from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...
- IIS安装与MVC程序部署
最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysq ...
- NodeJs爬虫—“眼睛好看是一种什么样的体验?”
逛知乎的时候经常看见有好多的福利贴(钓鱼贴),这不最近又让我发现了一个——眼睛好看是一种什么样的体验是一种怎么样的体验呢?我决定把答案里的照片都下到我的电脑里好好体验一下,怎么做呢,一张一张下好麻烦, ...
- 探究JVM——垃圾回收
垃圾回收主要考虑三件事情:哪些内存需要回收?什么时候回收?如何回收? 一.哪些内存需要回收? 堆内存:对于JVM 来说,垃圾回收主要是针对堆内存中的对象实例. 方法区:垃圾收集行为在方法区是比较少出现 ...
- MSSQL 问题集锦
[1]关于SQL Server数据库连接字符串的特殊参数说明 MultipleActiveResultSets和Mars_Connection同义,指定此数据库连接是否复用数据库内已建立的相同用户的连 ...