[BZOJ4316]小C的独立集 仙人掌?
因为xls让我每周模拟一次,然后学习模拟中没有学过的东西。所以就来学圆方树。
本来这道题用不着圆方树,但是圆方树是看yyb的博客学的,他在里面讲一下作为一个引子,所以也来写一下。
首先来Tarjan dfs可以形成一棵dfs树。
设\(dp[i][0/1]\)表示\(x\)这个点不选/选的时候的子树的最大独立集。
如果一条边是树边,那么直接按照常规的最大独立集转移。
如果遇到一个环,那么我们把单独单独处理一下。根据套路,我们要枚举一下环顶端选不选。
如果不选,那么底端的初值也是可以选可以不选的。如果选了,那么底端就只能不选。
然后就是在链上跑了。设\(f1,f2\)表示这条链上到这个点时的所有点的答案(不只是链上点单独的答案)。然后随便转移就好了。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define FEC(i,x,y) for(int i=head[x],y=g[i].to;i;i=g[i].ne,y=g[i].to)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
const int SZ=(1<<21)+1;char ibuf[SZ],*iS,*iT;
#ifdef ONLINE_JUDGE
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SZ,stdin),(iS==iT?EOF:*iS++)):*iS++)
#else
#define gc() getchar()
#endif
template<typename I>inline void read(I&x){char c=gc();int f=0;for(;c<'0'||c>'9';c=gc())c=='-'?f=1:0;for(x=0;c>='0'&&c<='9';c=gc())x=(x<<1)+(x<<3)+(c&15);f?x=-x:0;}
template<typename A,typename B>inline char SMAX(A&a,const B&b){return a<b?a=b,1:0;}
template<typename A,typename B>inline char SMIN(A&a,const B&b){return a>b?a=b,1:0;}
typedef long long ll;typedef unsigned long long ull;typedef std::pair<int,int>pii;
const int N=50000+7,M=120000+7,INF=0x3f3f3f3f;
int n,m,x,y,f[N],dp[N][2];
struct Edge{int to,ne;}g[M];int head[N],tot;
inline void Addedge(int x,int y){g[++tot].to=y;g[tot].ne=head[x];head[x]=tot;}
inline void DP(int x,int rt){
int t0,t1,f0=0,f1=0;
for(int p=x;p!=rt;p=f[p])t0=max(f0+dp[p][0],f1+dp[p][1]),t1=f0+dp[p][0],f0=t0,f1=t1;
dp[rt][0]+=f0;f0=0,f1=-INF;
for(int p=x;p!=rt;p=f[p])t0=max(f0+dp[p][0],f1+dp[p][1]),t1=f0+dp[p][0],f0=t0,f1=t1;
dp[rt][1]+=f1;
}
int low[N],dfn[N],scc[N],sccno,dfc,S[N],tp;
inline void Tarjan_dfs(int x,int fa=0){
S[++tp]=x;f[x]=fa;dfn[x]=low[x]=++dfc;dp[x][1]=1;
FEC(i,x,y)if(y!=fa){
if(!dfn[y])Tarjan_dfs(y,x),SMIN(low[x],low[y]);
else if(!scc[y])SMIN(low[x],dfn[y]);
if(low[y]>dfn[x])dp[x][1]+=dp[y][0],dp[x][0]+=max(dp[y][0],dp[y][1]);
}
FEC(i,x,y)if(dfn[y]>dfn[x]&&f[y]!=x)DP(y,x);
}
int main(){
read(n),read(m);
for(int i=1;i<=m;++i)read(x),read(y),Addedge(x,y),Addedge(y,x);
Tarjan_dfs(1);printf("%d\n",max(dp[1][0],dp[1][1]));
}
[BZOJ4316]小C的独立集 仙人掌?的更多相关文章
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 57 Solved: 41[Submit][Status][Discuss] ...
- BZOJ 4316: 小C的独立集 仙人掌 + 树形DP
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...
- 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的独立集(dfs树/仙人掌+DP)
本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...
- [BZOJ4316]小C的独立集(圆方树DP)
题意:求仙人掌图直径. 算法:建出仙人掌圆方树,对于圆点直接做普通的树上DP(忽略方点儿子),方点做环上DP并将值直接赋给父亲. 建图时有一个很好的性质,就是一个方点在邻接表里的点的顺序正好就是从环的 ...
- bzoj4316: 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- BZOJ.4316.小C的独立集(仙人掌 DP)
题目链接 \(Description\) 求一棵仙人掌的最大独立集. \(Solution\) 如果是树,那么 \(f[i][0/1]\) 表示当前点不取/取的最大独立集大小,直接DP即可,即 \(f ...
- 【题解】Bzoj4316小C的独立集
决定要开始学习圆方树 & 仙人掌相关姿势.加油~~ 其实感觉仙人掌本质上还是一棵树,长得也还挺优美的.很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进.这题首先如果是在树上的话那么实 ...
随机推荐
- spring boot整合WebSocket示例
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...
- php prev()函数 语法
php prev()函数 语法 作用:将内部指针指向数组中的上一个元素,并输出.直线电机选型 语法:prev(array) 参数: 参数 描述 array 必需.指定需要操作的数组. 说明:如果数组包 ...
- 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)
写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...
- 简单Spring整合JdbcTemplate
实体类: public class User implements Serializable{ private Integer id; private String username; private ...
- Linux 用户和组信息
linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号.在使用linux操作系统时候,通常我们会遇到对多用户进行管理.比如: 用户账号的添加. ...
- Gym 100917M Matrix, The
题目链接: http://codeforces.com/gym/100917/problem/M --------------------------------------------------- ...
- leetcode 238. 除自身以外数组的乘积 (python)
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...
- ArrayList 源码解读
ArrayList 源码解读 基于JDk 1.7.0_80 public class ArrayList<E> extends AbstractList<E> impl ...
- hihocoder 1015 : KMP算法(kmp)
传送门 Description 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一只河蟹,于是河蟹就向小H ...
- HTML5-新增表单元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...