题意:

给定一棵树,每次可以拆掉一个树上度数为偶数的点,拆掉该点后,与该点所连的所有边都会被删掉。问,是否有一种删点顺序可以删掉所有的点。如果有,则输出任意一组解。

数据范围:线性做法 O(n)O(n)O(n)

不妨从叶子节点开始考虑问题。不难证明,距叶子节点最近的一个偶点一定要在删除父节点之前被删掉,因为如果先删除父节点则原偶点及其子树中所有点的度数都会是基数。

值得注意的是,每次选择的一定是深度最大的叶节点,所以我们要在 dfsdfsdfs 序上进行操作

我们可以在树的 dfsdfsdfs 序上进行操作。然后对第一个偶点进行 dfsdfsdfs,dfsdfsdfs 的过程中将所有偶点加入到答案队列中,并将第一个找到的偶点与父节点分离。这样,父节点有成为了全新的叶节点,并如此反复下去即可。

时间复杂度为 O(n)O(n)O(n)。

Code:

#include<cstdio>
#include<stack>
#include<queue>
using namespace std;
const int maxn = 500000 + 5;
int head[maxn], to[maxn << 1], nex[maxn << 1], cnt, degree[maxn], parent[maxn], vis[maxn];
stack<int>dfs; queue<int> answer;
inline void add_edge(int u,int v)
{
nex[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
}
void dfs1(int u,int fa)
{
dfs.push(u); parent[u] = fa;
for(int v = head[u]; v ; v = nex[v]) if(to[v] != fa) dfs1(to[v], u);
}
void dfs2(int u)
{
answer.push(u); vis[u] = 1;
for(int v = head[u]; v ; v = nex[v]){
--degree[to[v]];
if(to[v] == parent[u] || vis[to[v]]) continue;
if(degree[to[v]] % 2 == 0) dfs2(to[v]);
}
}
int main()
{ int n; scanf("%d",&n);
for(int i = 1;i <= n; ++i){ int a; scanf("%d",&a); if(a == 0) continue; add_edge(i,a); add_edge(a,i); ++degree[a], ++degree[i]; }
dfs1(1, 0);
while(dfs.size())
{
int u = dfs.top(); dfs.pop();
if(degree[u] % 2 == 0) dfs2(u);
}
if(answer.size() == n)
{
printf("YES\n");
while(!answer.empty()){ printf("%d\n",answer.front()); answer.pop();}
}
else printf("NO");
return 0;
}

D. Destruction of a Tree_dfs序_性质分析_思维题的更多相关文章

  1. BZOJ 1108: [POI2007]天然气管道Gaz 性质分析_小结论_巧妙

    Description Mary试图控制成都的天然气市场.专家已经标示出了最好的天然气井和中转站在成都的地图.现在需要将中转 站和天然气井连接起来.每个中转站必须被连接到正好一个钻油井,反之亦然. M ...

  2. CF1168B Good Triple 性质分析_好题

    题意翻译 给出01串s,求数对[l,r]个数,使得能找到至少一对[x,k],使1<=x,k<=|s|且l<=x<x+2k<=r且s[x]=s[x+k]=s[x+2k] 题 ...

  3. cb34a_c++_STL_算法_查找算法_(7)_lower_bound

    cb34a_c++_STL_算法_查找算法_(7)_lower_bound//针对已序区间的查找算法,如set,multiset关联容器-自动排序lower_bound()--第一个可能的位置uppe ...

  4. cb33a_c++_STL_算法_查找算法_(6)binary_search_includes

    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...

  5. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_findadjacent_find(b,e),b,begin(),e,end()adjacent_find(b,e,p),p-par ...

  6. cb28a_c++_STL_算法_查找算法_(1)find_find_if

    cb28a_c++_STL_算法_查找算法_(1)find_find_iffind() //线性查找,比较慢.pos1 = find(ilist.begin(), ilist.end(), 5);fi ...

  7. 日志分析_使用shell完整日志分析案例

    一.需求分析 1. 日志文件每天生成一份(需要将日志文件定时上传至hdfs) 2. 分析日志文件中包含的字段:访问IP,访问时间,访问URL,访问状态,访问流量 3. 现在有"昨日" ...

  8. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  9. 基于samba实现win7与linux之间共享文件_阳仔_新浪博客

    基于samba实现win7与linux之间共享文件_阳仔_新浪博客 然后启动samba执行如下指令: /dev/init.d/smb start 至此完成全部配置.

随机推荐

  1. php进程控制

    1 POSIX扩展    posix_access($file,$mode)  查看文件的访问权限,可以由is_readable等几个函数代替    posix_errno()  返回posix函数执 ...

  2. Vue学习之路第十四篇:v-for指令中key的使用注意事项

    1.学前准备: JavaScript中有一个方法:unshift() ,其作用是向数组的开头添加一个或更多元素,并返回新的长度.该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新 ...

  3. 【hiho一下 第十周】后序遍历

    [题目链接]:http://hihocoder.com/problemset/problem/1049 [题意] [题解] 前序遍历的第一个节点; 肯定是整颗树的头结点; 然后在中序遍历中; 得到这个 ...

  4. BA-Delta知识点

    问题: DSM-RTR的网络负载能力是怎样的?每条总线带32个模块吗?MS/TP总线上的模块需要拨地址码吗?最大可以承载多少个点? 答:理论值是30,最佳性能是21个,一般情况25-28个 linkn ...

  5. [Linux]第五部分-Linux系统管理员

    启动流程如下:1.加载BIOS信息,读取第一个启动设备代号2.读取第一个启动设备的Mbr引导程序的启动信息3.加载操作系统核心信息4.核心执行init程序并获取运行信息5.init执行 /etc/rc ...

  6. HDU 2138

    这题用MILLER测试应该是不可避免的. #include <iostream> #include <cstdio> #include <stdlib.h> #in ...

  7. quick-cocos2dx 之transition.execute()的缓动效果

    注:本文图片来源(http://hosted.zeh.com.br/tweener/docs/en-us/misc/transitions.html. 侵权请告知,即刻删除) 什么是缓动, 缓动(ea ...

  8. CountDownLatch使用方法

    CountDownLatch是一个同步辅助类,在完毕一组正在其它线程中运行的操作之前.它同意一个或多个线程一直等待. 如果我们周末要去旅游.出游前须要提前订好机票.巴士和酒店,都订好后就能够出发了.这 ...

  9. C++数值类型极限值的获取

    C/C++中基本类型的数值极限值一般来说都是与详细平台有关的,在程序设计的过程中为了写出与平台无关的程序则必须通过合理科学的方法去获取各种类型的极值,经常使用的获取方法有两种:一种是传统的C语言所採用 ...

  10. c1

    dmg和package是安装文件,dmg直接拖进应用程序中,pkg要进行安装. playfround是swift项目. --ios -----oc(面向对象的C) -----swift(oc的封装) ...