【BZOJ4316】小C的独立集
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
一开始觉得一脸不可做..后来发现是个仙人掌图..可以直接仙人掌DP
但是忘了仙人掌缩点姿势了..又看了一发hillan的缩点..
然后直接dp.f[i][0/1]表示整个图里点i选和不选,g[i][0/1]表示在某个环里点i选和不选,然后整体DP,遇到环单独进去DP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 100010
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,m,u,v,cnt,top;
inline void in(int &x)
{char ch=getchar();x=0;while (!GET) ch=getchar();while (GET) x=x*10+ch-'0',ch=getchar();
}
struct edge { int to; edge *next; }e[MAXN<<1],*prev[MAXN];
inline void insert(int u,int v) { e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top]; }
int f[MAXN][2],g[MAXN][2];
int sta[MAXN],tp;
int low[MAXN],dfn[MAXN],deep[MAXN],fa[MAXN];
void dp(int x,int to)
{for (sta[0]=x,sta[tp=1]=to;sta[tp]!=x;sta[++tp]=fa[sta[tp-1]]);int t1,t2;g[0][0]=g[0][1]=0;for (int i=1;i<=tp;i++)g[i][1]=g[i-1][0]+f[sta[i]][1],g[i][0]=max(g[i-1][0],g[i-1][1])+f[sta[i]][0];t1=g[tp][0];g[0][0]=-1;for (int i=1;i<=tp;i++)g[i][1]=g[i-1][0]+f[sta[i]][1],g[i][0]=max(g[i-1][0],g[i-1][1])+f[sta[i]][0];t2=g[tp][1];f[x][1]=t2;f[x][0]=t1;
}
void dfs(int x)
{low[x]=dfn[x]=++cnt;f[x][1]=1;f[x][0]=0;for (edge *i=prev[x];i;i=i->next)if (i->to!=fa[x]){if (deep[i->to]) low[x]=min(low[x],dfn[i->to]);else{fa[i->to]=x;deep[i->to]=deep[x]+1;dfs(i->to);if (low[i->to]>dfn[x]) f[x][1]+=f[i->to][0],f[x][0]+=max(f[i->to][1],f[i->to][0]);low[x]=min(low[x],low[i->to]);}}for (edge *i=prev[x];i;i=i->next)if (i->to!=fa[x]&&low[i->to]==dfn[x]&&deep[i->to]!=deep[x]+1) dp(x,i->to);
}
int main()
{for (in(n),in(m);m;m--) in(u),in(v),insert(u,v),insert(v,u);deep[1]=1;fa[1]=1;dfs(1);printf("%d\n",max(f[1][0],f[1][1]));
}
【BZOJ4316】小C的独立集相关推荐
- bzoj4316: 小C的独立集
bzoj4316: 小C的独立集 链接 bzoj 思路 不是环的边==没有上司的舞会. 其他的,把环拿出来,考虑与深度最小的点u的交界处的点选不选,进行两次dp更新f[u] 代码 #include & ...
- 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的独立集(仙人掌+树形dp)
传送门 题意:给出一个仙人掌森林求其最大独立集. 思路:如果没有环可以用经典的树形 d p dp dp解决. f i , 0 / 1 f_{i,0/1} fi,0/1表示第 i i i个点不选/选的 ...
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 57 Solved: 41 [Submit][Status][Discus ...
- bzoj 4316: 小C的独立集(仙人掌树形DP)
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 682 Solved: 380 [Submit][Status][Disc ...
- BZOJ 4316: 小C的独立集 仙人掌 + 树形DP
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...
- 【BZOJ4316】小C的独立集(仙人掌,动态规划)
题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 Tarjan T a r j a n Tarjan的本质其实就是一个构建 dfs d f ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
最新文章
- IplImage和Mat间的相互转换
- 修正 IE 的双倍页边距 bug
- 为什么你学C++就那么难?
- 树莓派 + Windows IoT Core 搭建环境监控系统
- CC2530通用I/O
- 理解TCP/IP协议
- Emgu.CV.CvInvoke的类型初始值设定项引发异常
- solr学习笔记-linux下配置solr
- 英语在线听力翻译器_在线翻译英语软件推荐 在线翻译英语软件哪个好
- LabelImg安装
- 计算机安装系统后鼠标无法使用,电脑重装系统后鼠标键盘不能用怎么办,鼠标键盘不能用解决方法...
- 千方百剂显示服务器错误,千方百剂远程服务器地址
- 决策树--CART算法
- VMware Workstation for Windows 历史版本
- 征服spring源码(一)
- linux strace php,在Linux下使用strace窥视Oracle LGWR进程
- 8月3日 我用吃证明她的手艺
- 硬核FutureTask解析
- 专业表操作鉴权(增、删、改、id查、全查、名字模糊查)
- Java 中XO 的概念