Codeforces 765E. Tree Folding [dfs][树形dp]
题解:
先从节点1开始dfs。
对于每一个节点,用一个set记录:以该点为根的子树的深度。
a) 如果此节点的某个子节点打出了GG,则此节点直接打出GG。
b) 若set的元素个数<=1,那么,以该点为根的子树,显然是可以
缩成一条链滴!且该点为链的端点。
c) 若set元素个数=2,以该点为根的子树,也可以收缩成一条链,
且该点不是链的端点。此时,我们继续分类讨论。
i) 该点没有父亲。我们成功找到了一条链~岂不美哉。
ii) 该点有父亲,那么在链上会长出一根奇怪的东西。那我们赶紧报警,把该点赋给root,并打出GG
d)若set中元素个数>2,直接打出GG!
如果从1开始dfs求索未得,那一定是root的打开方式不对。我萌以root为起点再来一遍dfs。
如果还不行,那就真.GG。
#include <iostream>
#include <vector>
#include <set>
#include <cstdio>
using namespace std;
const int NICO = 200000 + 10;
vector<int> vec[NICO];
int n, u, v, root;
int dfs(int x, int par)
{
set<int> st;
for(int i=0;i<vec[x].size();i++)
{
int cur = vec[x][i];
if(cur == par) continue;
int t=dfs(cur, x);
if(t == -1) return -1;// 子节点都已经报警了,就不要再dfs啦!
st.insert(t+1);
}
if(st.size() == 0) return 0;
if(st.size() == 1) return *st.begin();
if(st.size() == 2 && par == 0) return *st.rbegin() + *st.begin();
root = x; // 风起于青萍之末~ 此刻,报警吧!
return -1;
}
int main()
{
cin >> n;
for(int i=1;i<n;i++)
{
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
int ans = dfs(1, 0);
if(ans == -1 && root) ans = dfs(root, 0);
while(ans%2==0)
{
ans /= 2;
}
cout << ans << endl;
}
Codeforces 765E. Tree Folding [dfs][树形dp]的更多相关文章
- Codeforces 1276D - Tree Elimination(树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 繁琐的简单树形 dp(大雾),要是现场肯定弃了去做 F 题 做了我一中午,写篇题解纪念下. 提供一种不太一样的思路. 首先碰到这样的题肯定 ...
- Codeforces 791D Bear and Tree Jump(树形DP)
题目链接 Bear and Tree Jumps 考虑树形DP.$c(i, j)$表示$i$最少加上多少后能被$j$整除. 在这里我们要算出所有$c(i, k)$的和. 其中$i$代表每个点对的距离, ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- codeforces 337D Book of Evil (树形dp)
题目链接:http://codeforces.com/problemset/problem/337/D 参考博客:http://www.cnblogs.com/chanme/p/3265913 题目大 ...
- 杭电OJ——1011 Starship Troopers(dfs + 树形dp)
Starship Troopers Problem Description You, the leader of Starship Troopers, are sent to destroy a ba ...
- hdu5293 Tree chain problem 树形dp+线段树
题目:pid=5293">http://acm.hdu.edu.cn/showproblem.php?pid=5293 在一棵树中,给出若干条链和链的权值.求选取不相交的链使得权值和最 ...
- Codeforces 815C Karen and Supermarket 树形dp
Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...
随机推荐
- Python dir()/help()
dir() dir()用来查询一个类或者对象所有属性.你可以尝试一下 print dir(list) 返回的结果: ['__add__', '__class__', '__contains__', ' ...
- PHP文件上传处理
web中,文件上传是一个很常用的功能.如:上传头像.上传图片.这些提交到后台的图片都要交给后端处理.php提供了几个上传处理的函数,我把它们封装成类,以便日后使用. 处理流程(可能有不合理的地方,用时 ...
- Android学习20--OpenGL的"mapPoints"
在OpenGL中有时会需要求一个3维空间中的点在平移(缩放,旋转)后坐标是多少.需求相当于二维的mapPoints.可以通过这个函数实现 void multiplyMV (float[] result ...
- 前端总结·基础篇·CSS(二)视觉
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·CSS(四)兼容 目录 一.动画(animation)(IE ...
- Javascript高级程序设计——语法、关键字、保留字、变量、数据类型
1.了解基本语法,JS大小写区分.注释风格.什么是严格模式等. 2.知道ES3和ES5的关键字和保留字大概有哪些,如果使用关键字会报什么错,使用保留字决定于特定浏览器引擎. 3.全局变量和局部变量的定 ...
- storyboard页面跳转传值
受学姐的影响,习惯纯代码编程,这次要修改别人的代码,很多编程风格还不习惯. 在此之前,页面跳转我都用的是Navigation,故事板上的页面跳转带传值,让我卡了好半天. 页面跳转: [self per ...
- 每天一个Linux命令(06)--rmdir命令
终于忙完了公司的事,可以安静的充充电了. 今天学习一下Linux中命令:rmdir 命令,rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm -r dir 命 ...
- Java基础之数据类型和转换
一.常见的数据类型分类 1.java中基本数据类型分为三大类,即布尔类型,字符型,数值型.其中数值型又分为整型和浮点型.引用数据类型分为类,接口,数组,枚举,注解.具体如下: 注:一个字节 = 8位 ...
- hdoj 1231 最大连续子列和
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Oracle 一些简单操作
登录oracle 以root用户切换到oracle数据库用户:su - oracle 输入sqlplus /nolog 不连接任何数据库 conn /as sysdba 用sysdba登录 start ...