【题解】Bzoj4316小C的独立集
决定要开始学习圆方树 & 仙人掌相关姿势。加油~~
其实感觉仙人掌本质上还是一棵树,长得也还挺优美的。很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进。这题首先如果是在树上的话那么实际上就是没有上司的舞会。当出现了环的时候意味着我们需要针对环的存在做出特殊的处理。
还是设立状态 \(f[i][1/0]\) 表示在 \(i\) 的子树内(包括\(i\))时选取 \(i\) 与不选取 \(i\) 的最大独立集大小。当转移发生在树边上的时候,直接转移。当不是树边的时候,我们可以将环上的点单独拿出来重新dp。实际上也就是要处理环上非树边的排斥关系,保证这层关系并转移。其实由于仙人掌上的环不包含,不交叉,很多的时候是类似于一棵基环树的(只不过环变多了?但不影响本质吧)。
判断树边/非树边的依据就是 \(dfn, low\) 等值的大小。而一个环的根与底部也同样可以运用dfs树的性质来解决。
#include <bits/stdc++.h>
using namespace std;
#define maxn 150000
#define INF 99999999
int n, m, cnp = , head[maxn];
int f[maxn][], fa[maxn];
int timer, dfn[maxn], low[maxn]; struct edge
{
int to, last;
}E[maxn]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void add(int u, int v)
{
E[cnp].to = v, E[cnp].last = head[u], head[u] = cnp ++;
E[cnp].to = u, E[cnp].last = head[v], head[v] = cnp ++;
} void DP(int S, int T)
{
int f1 = , f0 = ;
for(int i = T; i != S; i = fa[i])
{
int t1 = f1 + f[i][], t0 = f0 + f[i][];
f0 = max(t1, t0); f1 = t0;
}
f[S][] += f0; f0 = , f1 = -INF;
for(int i = T; i != S; i = fa[i])
{
int t1 = f1 + f[i][], t0 = f0 + f[i][];
f0 = max(t1, t0); f1 = t0;
}
f[S][] += f1;
} void dfs(int u, int gra)
{
fa[u] = gra; dfn[u] = low[u] = ++ timer;
f[u][] = , f[u][] = ;
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(!dfn[v]) dfs(v, u), low[u] = min(low[u], low[v]);
else if(v != gra) low[u] = min(low[u], dfn[v]);
if(low[v] > dfn[u])
f[u][] += f[v][], f[u][] += max(f[v][], f[v][]);
}
for(int i = head[u]; i; i = E[i].last)
if(fa[E[i].to] != u && dfn[u] < dfn[E[i].to])
DP(u, E[i].to);
} int main()
{
n = read(), m = read();
for(int i = ; i <= m; i ++)
{
int u = read(), v = read();
add(u, v);
}
dfs(, );
printf("%d\n", max(f[][], f[][]));
return ;
}
【题解】Bzoj4316小C的独立集的更多相关文章
- BZOJ4316 小C的独立集 【仙人掌】
题目 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使取出的点尽量多. ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- [BZOJ4316]小C的独立集(圆方树DP)
题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的 ...
- 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)
传送门 题意:给出一个仙人掌森林求其最大独立集. 思路:如果没有环可以用经典的树形dpdpdp解决. fi,0/1f_{i,0/1}fi,0/1表示第iii个点不选/选的最大独立集. 然后fi,0+ ...
- [BZOJ4316]小C的独立集 仙人掌?
题目链接 因为xls让我每周模拟一次,然后学习模拟中没有学过的东西.所以就来学圆方树. 本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下. 首先来Ta ...
- bzoj4316小C的独立集(dfs树/仙人掌+DP)
本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...
- 【BZOJ4316】小C的独立集(动态规划)
[BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...
- 【BZOJ4316】小C的独立集(仙人掌,动态规划)
[BZOJ4316]小C的独立集(仙人掌,动态规划) 题面 BZOJ 题解 除了普通的动态规划以外,这题还可以用仙人掌的做法来做. 这里没有必要把圆方树给建立出来 \(Tarjan\)的本质其实就是一 ...
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 57 Solved: 41[Submit][Status][Discuss] ...
随机推荐
- 【实现高可效的代理模式-Squid】
普通正向代理 首先安装squid代理软件包: 端口控制 在squid server端作端口访问控制,把默认的3128端口改为1000端口 同时把squid服务代理端口添加到selinux安全子系统的允 ...
- git克隆出错 github clone Permission denied (publickey) fatal Could not read from remote repo
原文网址:http://blog.csdn.net/feeling450/article/details/53067563 github clone "Permission denied ( ...
- Linux基础(04)、功能配置(调整防火墙、静态IP、环境变量)
目录 一.centos防火墙 二.VMware网络连接方式 2.1.连接方式:桥接.NAT.仅主机 2.2.常见问题 三.centos配置静态IP 四.环境变量 4.1.什么是环境变量 4.2.临时修 ...
- Scrapy之Cookie和代理
cookie cookie: 获取百度翻译某个词条的结果 一定要对start_requests方法进行重写. 两种解决方案: 1. Request()方法中给method属性赋值成post2. For ...
- go学习笔记-类型转换(Type Conversion)
类型转换(Type Conversion) 类型转换用于将一种数据类型的变量转换为另外一种类型的变,基本格式 type_name(expression) type_name 为类型,expressio ...
- ORACLE中order by造成分页不正确原因分析
工作中遇到的问题: 为调用方提供一个分页接口时,调用方一直反应有部分数据取不到,且取到的数据有重复的内容,于是我按以下步骤排查了下错误. 1.检查分页页码生成规则是否正确. 2.检查SQL语句是否正 ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- 史上最全的PHP正则表达式
首先看下正则表达式思维导图: 一.校验数字的表达式 1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头 ...
- 在Linux下通过rpm打包发布Java程序
这个东西涉及的内容较多,根据下面这些文章慢慢学习 一个简单的例子 http://blog.csdn.net/king_on/article/details/7169384 按照文章中的步骤来,打包之后 ...
- C# 获取当前日期当年的周数
这几天跨年,项目上遇到了一个周数计算的问题. 2016年的元旦是周五开始的,之前系统计算的是属于15年的第53个周,但是年份已经到了16年了. 公司要求从1月1号周五开始算作16年的第一个周,今天1月 ...