Description

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

Input

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

Output

输出这个图的最大独立集。
 
dfs一次断开每个环上最后被访问到的一条边,环上除了环的根以外所有点组成一条链
f0/f1表示一个点不选/不做强制要求时dfs子树内的最大独立集
g0/g1表示一个点不选/不做强制要求,但这个点所在的链的底部强制不选时dfs子树内的最大独立集
转移方式类似树形dp
#include<cstdio>
const int N=,R=;
char buf[R+],*ptr=buf-;
int n,m,ans=;
int et[],enx[],e0[N],ep=;
int ed[N],stk[N],stp=,bm[N],tp[N],dep[N];
int f0[N],f1[N],g0[N],g1[N];
inline int _int(){
int x=,c=*++ptr;
while(c<)c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x;
}
inline void maxs(int&a,int b){if(a<b)a=b;}
bool rt[N];
void dfs1(int w){
ed[w]=;
stk[++stp]=w;
for(int i=e0[w],u;i;i=enx[i])if(u=et[i]){
if(!ed[u]){
et[i^]=;
dep[u]=dep[w]+;
dfs1(u);
}else{
et[i]=et[i^]=;
while(dep[stk[stp]]>dep[u]){
int x=stk[stp--];
bm[x]=w;tp[x]=u;
}
}
}
if(stk[stp]==w)--stp;
}
void dfs2(int w){
f1[w]=;
if(w!=bm[w])g1[w]=;
for(int i=e0[w],u;i;i=enx[i])if(u=et[i]){
dfs2(u);
if(bm[u]!=bm[w]){
if(tp[u]!=w)g0[w]+=f1[u],g1[w]+=f0[u];
else g0[w]+=f1[u],g1[w]+=g0[u];
}else g0[w]+=g1[u],g1[w]+=g0[u];
if(tp[u]!=w)f0[w]+=f1[u],f1[w]+=f0[u];
else f0[w]+=f1[u],f1[w]+=g0[u];
}
maxs(f1[w],f0[w]);
maxs(g1[w],g0[w]);
}
int main(){
fread(buf,,R,stdin);
n=_int();m=_int();
while(m--){
int a=_int(),b=_int();
et[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
et[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
dfs1();dfs2();
printf("%d\n",f1[]);
return ;
}

bzoj4316: 小C的独立集的更多相关文章

  1. [BZOJ4316]小C的独立集(圆方树DP)

    题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的 ...

  2. BZOJ4316 小C的独立集 【仙人掌】

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

  3. 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)

    传送门 题意:给出一个仙人掌森林求其最大独立集. 思路:如果没有环可以用经典的树形dpdpdp解决. fi,0/1f_{i,0/1}fi,0/1​表示第iii个点不选/选的最大独立集. 然后fi,0+ ...

  4. 【题解】Bzoj4316小C的独立集

    决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...

  5. [BZOJ4316]小C的独立集 仙人掌?

    题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...

  6. bzoj4316小C的独立集(dfs树/仙人掌+DP)

    本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...

  7. 【BZOJ4316】小C的独立集(动态规划)

    [BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...

  8. 【BZOJ4316】小C的独立集(仙人掌,动态规划)

    [BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...

  9. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

随机推荐

  1. Qt之动画框架

    简述 Qt动画框架旨在为创建动画和平滑的GUI提供了一种简单的方法.通过Qt动画属性,该框架为部件和其它QObject对象的动画操作提供了非常大的自由性,框架也可以被用于图形视图框架中,动画框架中许多 ...

  2. 【转】java环境配置

    JAVA开发环境的搭建(配置JAVA开发环境) 一.安装JDK 1. JVM(Java Virtual Machine—Java虚拟机) JRE(Java Runtime Environment—Ja ...

  3. (实用篇)PHP JSON数组与对象的理解

    在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...

  4. hdu 3666 Making the Grade

    题目大意 给出了一列数,要求通过修改某些值,使得最终这列数变成有序的序列,非增或者非减的,求最小的修改量. 分析 首先我们会发现,最终修改后,或者和前一个数字一样,或者和后一个数字一样,这样才能修改量 ...

  5. UI学习笔记---第一天

    一.iOS概述 iOS是Apple公司的移动操作系统,主要⽤用于iPhone.iPad.iPad Mini.iPod Touch等移动产品. 借助iOS,我们可以开发视频类.美图类.新闻类.⾳乐类.团 ...

  6. VPS 搭建 SS

    推荐 VPS:http://www.vultr.com/?ref=6915101 1.连接 VPS 运行命令 ssh root@xx.xx.xx.xx -p 22 // vultr 的端口为 22 然 ...

  7. console下纯字符实现的俄罗斯方块

    忙里偷闲,消遣一下,先上一张寒酸的效果图: 废话不多说,直接上代码,win7 64 code blocks编译通过. 吐槽一下cb的watch功能实在不够友好,不过免费的也不能要求太高. [按键说明] ...

  8. jQuery 鼠标滚轮插件应用 mousewheel

    jQuery Mousewheel Plugin,用于添加跨浏览器的鼠标滚轮支持. mousewheel事件的处理函数有一点小小的变化,它除了第一个参数event 外,还接收到第二个参数delta. ...

  9. What are the main disadvantages of Java Server Faces 2.0?

    http://stackoverflow.com/questions/3623911/what-are-the-main-disadvantages-of-java-server-faces-2-0/ ...

  10. C++泛型编程原理

    1.什么是泛型编程前面我们介绍的vector,list,map都是一种数据结构容器,容器本身的存储结构不同,各容器中存在的数据类型也可以不同.但我们在访问这些容器中数据时,拥有相同的方式.这种方式就叫 ...