4316: 小C的独立集

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 57  Solved: 41
[Submit][Status][Discuss]

Description

图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨。
这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多。
小D虽然图论很弱,但是也知道无向图最大独立集是npc,但是小C很仁慈的给了一个很有特点的图: 图中任何一条边属于且仅属于一个简单环,图中没有重边和自环。小C说这样就会比较水了。
小D觉得这个题目很有趣,就交给你了,相信你一定可以解出来的。

Input

第一行,两个数n, m,表示图的点数和边数。
第二~m+1行,每行两个数x,y,表示x与y之间有一条无向边。

Output

输出这个图的最大独立集。

Sample Input

5 6
1 2
2 3
3 1
3 4
4 5
3 5

Sample Output

2

HINT

100% n <=50000, m<=60000

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=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
#define maxn 100010
struct EdgeNode{int next,to;}edge[maxn<<2];
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][2],dp2[maxn][2],ring[maxn],fa[maxn],dfn[maxn],low[maxn],t,deep[maxn];
void CactusDP(int st,int tt)
{ring[0]=st; ring[1]=tt; int zz=1;while (ring[zz]!=st) {ring[zz+1]=fa[ring[zz]]; zz++;}dp2[0][0]=dp2[0][1]=0;for (int i=1; i<=zz; i++)dp2[i][1]=dp2[i-1][0]+dp1[ring[i]][1],dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp1[ring[i]][0];int tmp=dp2[zz][0];dp2[0][0]=-0x7fffffff;for (int i=1; i<=zz; i++)dp2[i][1]=dp2[i-1][0]+dp1[ring[i]][1],dp2[i][0]=max(dp2[i-1][0],dp2[i-1][1])+dp1[ring[i]][0];dp1[st][0]=tmp; dp1[st][1]=dp2[zz][1];
}
void TreeDP(int now)
{dfn[now]=low[now]=++t;dp1[now][1]=1; dp1[now][0]=0;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]+1;TreeDP(edge[i].to);if (low[edge[i].to]>dfn[now]) dp1[now][1]+=dp1[edge[i].to][0],dp1[now][0]+=max(dp1[edge[i].to][1],dp1[edge[i].to][0]);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]+1)CactusDP(now,edge[i].to);
}
int main()
{n=read(),m=read();for (int u,v,i=1; i<=m; i++) u=read(),v=read(),insert(u,v);for (int i=1; i<=n; i++)if (!dfn[i]) {deep[i]=1; fa[i]=i; TreeDP(i); ans+=max(dp1[i][0],dp1[i][1]);}//为了防止出现仙人掌森林的情况QAQprintf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5595119.html

【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集相关推荐

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

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

  2. bzoj 4316: 小C的独立集(仙人掌树形DP)

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 682  Solved: 380 [Submit][Status][Disc ...

  3. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 73  Solved: 23 [Submit][Status ...

  4. bzoj4316: 小C的独立集

    bzoj4316: 小C的独立集 链接 bzoj 思路 不是环的边==没有上司的舞会. 其他的,把环拿出来,考虑与深度最小的点u的交界处的点选不选,进行两次dp更新f[u] 代码 #include & ...

  5. 仙人掌相关问题的解法(1)-DFS树解决仙人掌DP问题,圆方树

    前言 有难度的仙人掌题在近几年也只是在国家集训队水平的比赛里才会出现. 不过,这不是说仙人掌对国集水平以下的选手意义不大: 首先,仙人掌暴力 DP 问题难度并不大,在省选. NOI 甚至 NOIP 中 ...

  6. 【BZOJ4316】小C的独立集

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

  7. bzoj 4447 小凸解密码

    bzoj 4447 小凸解密码 先将原始状态的 \(B\) 处理出来,可以发现,若不修改,则每次指定的起始位置不同,对这个环 \(B\) 带来的影响只有 \(B_0\) 不同,即每次 \(B_0=A_ ...

  8. bzoj 3437 小p的农场

    bzoj 3437 小p的农场 思路 \(f[i]=min(f[j]+\sum\limits_{k=j+1}^{i}{b[k]*(i-k)}+a[i])\) \(f[i]=min(f[j]+\sum\ ...

  9. 【Cactus仙人掌图】仙人掌DP学习笔记

    我们从例题入手来考虑仙人掌上DP的一般规律叭. Ex 1.仙人掌上的单源最短路问题 联想树上最短路,由于路径的唯一性可以直接做一遍O(n)的搜索.但是仙人掌上显然不具备路径的唯一性这种性质. 那么我们 ...

最新文章

  1. Google 5月4日换装了(纪念凯斯·哈林)
  2. linux mint 下载辅助工具,Linux Mint 18.2 下载工具AxeluGet
  3. NetworkStream.write只能使用一次,后面再使用无效
  4. SQL Server SqlCacheDependency 缓存依赖
  5. 奇淫异巧之 PHP 后门
  6. MyBatis中or和and的使用问题
  7. python黑色背景_如何去除Matplotlib图中的黑色背景
  8. Python字符串isprintable()
  9. 删除Linux上的用户
  10. 关于super关键字
  11. 中小型企业无线网络设计
  12. 学校后台管理系统 php,基于ssm的校园门户网站+后台管理系统
  13. Keras-Unet-语义分割
  14. 神经网络论文Enhancing deep neural networks via multiple kernel learning
  15. 又是一道题拉开差距!IOI落幕,中国队三金一银,美国华人选手再获冠军
  16. 蓝桥杯的c语言编译器,第九届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学B组比赛心得(还在更新)...
  17. 第19篇 基础(十九)详解QVector(数组)
  18. 天堂图片网的星空图片保存到电脑上方法步骤
  19. 软件构件 API 在不同版本间的兼容性——读FSE 2012 best paper有感
  20. [BZOJ3928/4048]Outer space invaders

热门文章

  1. python numpy 矩阵乘法以及列向量与行向量乘法
  2. nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...
  3. 觉醒年代HTML,CSS接下文
  4. js技巧收集(200多个)——2
  5. 电脑卡住点什么都没反应怎么解决
  6. 软件测试岗位英文自我介绍,软件测试工程师自我介绍_工程师英文自我介绍范文...
  7. VBA-关闭屏幕刷新
  8. 数据科学家和人工智能职业生涯之外软件公司之外的热门市场
  9. 我的Go+语言初体验——Demo游戏体验篇(直男程序员的真实体验)
  10. QUAKE 3源代码评测:架构