传送门
题意:给出一个仙人掌森林求其最大独立集。


思路:如果没有环可以用经典的树形dpdpdp解决。
fi,0/1f_{i,0/1}fi,0/1​表示第iii个点不选/选的最大独立集。
然后fi,0+=max{fv,0,fv,1},fi,1+=fv,0f_{i,0}+=max\{f_{v,0},f_{v,1}\},f_{i,1}+=f_{v,0}fi,0​+=max{fv,0​,fv,1​},fi,1​+=fv,0​转移即可。
现在有了环考虑把每个环单独提出来更新一下。
就用个队列把整个环记录下来然后分这个环在原图中dfsdfsdfs出来的最高点选与不选分别dpdpdp更新即可。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
const int N=5e4+5;
int n,m,ans=0,fa[N],dfn[N],low[N],tot=0,f[N][2],g[N][2],q[N],top;
vector<int>e[N];
inline void solve(int rt,int x){int tmp0=f[rt][0],tmp1=f[rt][1],tmp=x;q[top=1]=x;while(x!=rt)x=fa[x],q[++top]=x;x=tmp;g[x][0]=f[x][0],g[x][1]=-0x3f3f3f3f;for(ri i=2;i<=top;++i){g[q[i]][0]=f[q[i]][0]+max(g[q[i-1]][0],g[q[i-1]][1]);g[q[i]][1]=f[q[i]][1]+g[q[i-1]][0];}tmp1=max(tmp1,g[rt][1]);g[x][0]=f[x][0],g[x][1]=f[x][1];for(ri i=2;i<=top;++i){g[q[i]][0]=f[q[i]][0]+max(g[q[i-1]][0],g[q[i-1]][1]);g[q[i]][1]=f[q[i]][1]+g[q[i-1]][0];}tmp0=max(tmp0,g[rt][0]);f[rt][0]=tmp0,f[rt][1]=tmp1;
}
void tarjan(int p){dfn[p]=low[p]=++tot,f[p][1]=1;for(ri i=0,v;i<e[p].size();++i){if((v=e[p][i])==fa[p])continue;if(!dfn[v])fa[v]=p,tarjan(v),low[p]=min(low[p],low[v]);else low[p]=min(low[p],low[v]);if(dfn[p]<low[v])f[p][0]+=max(f[v][0],f[v][1]),f[p][1]+=f[v][0];}for(ri i=0,v;i<e[p].size();++i)if(fa[v=e[p][i]]!=p&&dfn[p]<dfn[v])solve(p,v);
}
int main(){n=read(),m=read();for(ri i=1,u,v;i<=m;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);for(ri i=1;i<=n;++i)if(!dfn[i])tarjan(i),ans+=max(f[i][0],f[i][1]);cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10367707.html

2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)相关推荐

  1. BZOJ 4316: 小C的独立集 仙人掌 + 树形DP

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...

  2. bzoj4316: 小C的独立集

    bzoj4316: 小C的独立集 链接 bzoj 思路 不是环的边==没有上司的舞会. 其他的,把环拿出来,考虑与深度最小的点u的交界处的点选不选,进行两次dp更新f[u] 代码 #include & ...

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

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

  4. bzoj 4316: 小C的独立集(仙人掌树形DP)

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 682  Solved: 380 [Submit][Status][Disc ...

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

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

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

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

  7. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

    文章目录 T1:图 solution code T2:劫富济贫 solution code T3:小A的树 solution code T4:游戏 solution code T1:图 [问题描述] ...

  8. bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】

    这么简单的dp我怎么没想到x2 f为从这个点出发后回到这个点最多能走过的点,g为从这个点出发后不回到这个点最多能走过的点,注意g有两种转移:g[u][k]=max(g[u][k],f[u][k-j-1 ...

  9. bzoj 4711 小奇挖矿 ——“承诺”类树形dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对"承诺"有了更深的了解. 向外和向内要区分,所以 f [ i ] ...

最新文章

  1. [原] Jenkins Android 自动打包配置
  2. java--遍历自定义数组
  3. 20145234黄斐《网络对抗技术》实验八、Web基础
  4. (十四)java版spring cloud+spring boot 社交电子商务平台-使用spring cloud Bus刷新配置...
  5. publiccms实现多层级选项卡效果
  6. linux下如何安装配置redis及主从配置
  7. 精度76.16%,速度是SlowFast的4.5倍,视频理解模型PP-TSM重磅发布
  8. 归并排序的C++实现
  9. 电商渠道转化越来越低,究竟怎样引流才能提高转化率?
  10. 界面为ScrollView时打开界面会自动滚动到底部之解决方法
  11. Children’s Queue
  12. 推荐C语言视频<<跟着星仔学C语言>>
  13. 知识表示-马尔科夫链(MC)
  14. 北京邮电计算机学院保研概率,北京邮电大学计算机学院(专业学位)计算机技术保研细则...
  15. 常用RTCM3 5条常用报文介绍
  16. python fun函数输入某年某月_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
  17. MindMap学习使用
  18. 浅析爱心代码的绘制思路——python实现
  19. 教你2种常用的电商高并发处理解决方案
  20. 用Java实现成绩等级划分

热门文章

  1. Scala项目启动方式:extends App和main的区别
  2. linux创建crontab定时任务
  3. jenkins清除、修改admin主账号的密码
  4. 分布式锁的三种实现的对比
  5. Java设计模式之建造者Builder模式代码示例
  6. FastDFS分布式文件系统工作原理
  7. MySQL列转行sql语句
  8. Object类toString()和equals()方法剖析
  9. C++中max,min函数,以及vector字符未定义问题(未声明的标志符)
  10. mongoose Warning:Server Discovery and Monitoring engine is deprecated