bzoj 4316: 小C的独立集(仙人掌树形DP)
4316: 小C的独立集
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 682 Solved: 380
[Submit][Status][Discuss]
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
dp[u][0]表示只考虑u的子树,u点不选的方案个数
dp[u][1]表示只考虑u的子树,选了u点的方案个数
你就正常DP,然后每次DP到所有环中离根最近的那个点时,单独拉出来算一下就可以了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
vector<int> G[50005];
int t, dp[50005][2], low[50005], Time[50005], fa[50005];
void Gao(int u, int v)
{int i, s1, s0, t1, t0;s1 = s0 = 0;for(i=v;i!=u;i=fa[i]){t0 = s0+dp[i][0], t1 = s1+dp[i][1];s0 = max(t1, t0), s1 = t0;}dp[u][0] += s0;s1 = -1000000, s0 = 0;for(i=v;i!=u;i=fa[i]){t0 = s0+dp[i][0], t1 = s1+dp[i][1];s0 = max(t1, t0), s1 = t0;}dp[u][1] += s1;
}
void Trajan(int u, int p)
{int i, v;fa[u] = p;Time[u] = low[u] = ++t;dp[u][1] = 1, dp[u][0] = 0;for(i=0;i<G[u].size();i++){v = G[u][i];if(v==p)continue;if(Time[v]==0){Trajan(v, u);low[u] = min(low[v], low[u]);}elselow[u] = min(low[u], Time[v]);if(low[v]>Time[u]){dp[u][0] += max(dp[v][0], dp[v][1]);dp[u][1] += dp[v][0];}}for(i=0;i<G[u].size();i++){v = G[u][i];if(fa[v]!=u && Time[v]>Time[u])Gao(u, v);}
}
int main(void)
{int n, m, i, x, y;scanf("%d%d", &n, &m);for(i=1;i<=m;i++){scanf("%d%d", &x, &y);G[x].push_back(y);G[y].push_back(x);}Trajan(1, 0);printf("%d\n", max(dp[1][0], dp[1][1]));return 0;
}
bzoj 4316: 小C的独立集(仙人掌树形DP)相关推荐
- BZOJ 4316: 小C的独立集 仙人掌 + 树形DP
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. ...
- bzoj 4711 小奇挖矿 ——“承诺”类树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对"承诺"有了更深的了解. 向外和向内要区分,所以 f [ i ] ...
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 57 Solved: 41 [Submit][Status][Discus ...
- BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)
BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...
- [BZOJ4784][UOJ290][ZJOI017]仙人掌-树形DP
仙人掌 Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但 ...
- 2018.09.01 独立集(树形dp)
描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...
- bzoj 2427: [HAOI2010]软件安装(Trajan+树形DP)
2427: [HAOI2010]软件安装 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1844 Solved: 723 [Submit][Sta ...
- 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个点不选/选的 ...
最新文章
- [C++对象模型][6]sizeof与对象内存布局
- HttpWebRequest WebResponse 对象简单了解
- ffplay flv mp4 转_FFmpeg将mp4转成flv
- Android SDK镜像的介绍使用【转发】
- 两个多精度十进制数加法程序设计_Fortran程序设计基础
- numpy、cv2等操作图片基本操作
- dojo.declare
- centos 7 菜鸟第一天 装软件
- python调用activateMQ进行数据传输
- 怎么给图片或视频添加夜视效果?
- 利用NodeJs实现图片提取文字
- 邮件群发软件哪个好用?
- Java List集合排序 Java8 List集合排序方法 Java Lambda集合排序
- 计算机职业素养论文1500字,【职业素养论文】职业素养论文范文(共40篇)
- salve mysql_mysql:master--salve主从库同步备份锁表操作
- php 获取提成的公式,拿提成的工资怎么算的有公式吗_工资提成计算公式
- 移动安全 第六天-Iot安全
- 基于PHP+Html+mysql的客户关系管理CRM系统 文档+项目源码及数据库文件
- Python面向对象子类中重用父类的属性
- 一文带你学会linux系统 史上最全linux命令大全
热门文章
- 简单python脚本实例-python脚本例子
- python 在线培训费用-在线Python编程培训哪家机构比较好?
- python发音翻译-python实现在线翻译
- python入门指南 许半仙txt-影帝的脑子坏了
- vb还是python强大-VB强大还是python强大
- 零基础学python还是c语言-学C语言好还是Python好?
- php for 每次增加2,php – 为什么foreach会将refcount增加2而不是1?
- 手机重装android系统,手机系统重装
- repo打了 tag之后如何提交tag_技术开发者应该如何构建小团队的微服务方案?
- android skype 无法用蓝牙耳机,Skype发布更新 增加蓝牙耳机稳定性