决定要开始学习圆方树 & 仙人掌相关姿势。加油~~

  其实感觉仙人掌本质上还是一棵树,长得也还挺优美的。很多的想法都可以往树的方面上靠,再针对仙人掌的特性做出改进。这题首先如果是在树上的话那么实际上就是没有上司的舞会。当出现了环的时候意味着我们需要针对环的存在做出特殊的处理。

  还是设立状态 \(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的独立集的更多相关文章

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

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

  2. bzoj4316: 小C的独立集

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

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

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

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

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

  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. 新知识 HtMl 5

    快要毕业了,即将走向实习岗位,但是这日子过的太无聊了,昨天逃课回宿舍打开电脑想看电影但是没什么好看的,于是上床睡觉了,越躺越无聊,然后爬了起来到学习图书馆找了本HTML5的课本,学习了起来(我感觉ht ...

  2. weex踩坑记录

    weex框架样式问题--我暂时使用最基本的样式css,weex前端开发的话web端会显示各种的html标签.写出的样式也都会显示的很好,但是在app端的话,就没有很好的兼容性,只是支持文档中的一些标签 ...

  3. Odoo8中安装新模块找不到的问题

    为了要让系统识别出新的模块,我们需要打开用户的技术特性选项,具体在    左侧栏目->用户->administrator,  将技术特性勾选上,刷新.  然后左侧栏目->模块下面就会 ...

  4. ajax设置自定义头

    一.setting参数 headers $.ajax({ headers: {        Accept: "application/json; charset=utf-8"  ...

  5. How to add a webpart to your website

          I have download a webpart that can play media on the website from the internet.Then how to add ...

  6. Less入门教程

    http://www.cnblogs.com/fsjohnhuang/p/4187675.html

  7. 商业地产 招商 招租 CRM 意向 洽谈 合同 复用商铺商户管理系统

    适用场合 本软件适合商业地产的对招商的全流程管理,包括商铺信息,商户信息,洽谈信息,意向签订,合同管理等. 软件有试用版可供下载试用. 联系方式 QQ:2417158658 Tel:130251102 ...

  8. 菜鸟级appium 必看

    之所以写这个,因为太多新人,appium环境半天都搭建不好,版本问题,兼容问题等等. 自己的解决方案:1 官网下载nodejs,建议安装长期支持版 2 进入appium官网,点击下载,跳转到githu ...

  9. SpriteKit游戏开发适配iPad/iPhone6/7/8/Plus及iPhoneX的尺寸及安全区域

    未适配前:Ball球超过屏幕的上下方   适配后:Ball球就在屏幕的可视范围内运动了 一.那么如何适配不同的iPhone.iPhoneX及iPad的屏幕尺寸呢? 我们开发一个App的时候, 通常希望 ...

  10. LeetCode 410——分割数组的最大值

    1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...