B. Destruction of a Tree
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges).

A vertex can be destroyed if this vertex has even degree. If you destroy a vertex, all edges connected to it are also deleted.

Destroy all vertices in the given tree or determine that it is impossible.

Input

The first line contains integer n (1 ≤ n ≤ 2·105) — number of vertices in a tree.

The second line contains n integers p1, p2, ..., pn (0 ≤ pi ≤ n). If pi ≠ 0 there is an edge between vertices i and pi. It is guaranteed that the given graph is a tree.

Output

If it's possible to destroy all vertices, print "YES" (without quotes), otherwise print "NO" (without quotes).

If it's possible to destroy all vertices, in the next n lines print the indices of the vertices in order you destroy them. If there are multiple correct answers, print any.

Examples
input

Copy
5
0 1 2 1 2
output

Copy
YES
1
2
3
5
4
input

Copy
4
0 1 2 3
output

Copy
NO
Note

In the first example at first you have to remove the vertex with index 1 (after that, the edges (1, 2) and (1, 4) are removed), then the vertex with index 2 (and edges (2, 3) and (2, 5) are removed). After that there are no edges in the tree, so you can remove remaining vertices in any order.

题目大意:给你一棵树,只能删除度数为偶数的节点,节点删除后,与它相连的边也会删除。问你能否把所有点删除。

解题思路:只要你能想到,如果一棵树,有偶数条边,那么他一定能被删除完!或者说,一棵树有奇数个节点,那么他肯定能被删除完!因为,如果边为奇数,每次删除偶数条边,最后肯定剩奇数个边啊!如果边为偶数,每次删除偶数条边,最后肯定能删除完!所以基于这个思想,我们递归的删除点即可。从根节点开始,如果某一棵子树他的节点个数为偶数(加上当前节点就为奇数了),那么就深搜这颗子树,递归删除。

#include <bits/stdc++.h>
using namespace std; vector<int> ch[];
int sz[]; void getsize(int u, int pre)
{
sz[u] = ;
for (int i = ; i < ch[u].size(); ++i)
{
if (ch[u][i] != pre)
{
getsize(ch[u][i], u);
sz[u] += sz[ch[u][i]];
}
}
} void dfs(int u, int pre)
{
for (int i = ; i < ch[u].size(); i++)
{
if (ch[u][i] != pre)
{
if (sz[ch[u][i]] % == )
{
dfs(ch[u][i], u);
}
}
} printf("%d\n", u); for (int i = ; i < ch[u].size(); i++)
{
if (ch[u][i] != pre)
{
if (sz[ch[u][i]] % == )
{
dfs(ch[u][i], u);
}
}
}
} int main()
{ int N;
scanf("%d", &N);
int temp;
int root;
for (int i = ; i <= N; i++)
{
scanf("%d", &temp);
if (temp != )
{
ch[i].push_back(temp);
ch[temp].push_back(i);
}
else
{
root = i;
}
} if (N % == )
{
printf("NO\n");
}
else
{
getsize(root,-);
printf("YES\n");
dfs(root, -);
} return ;
}

我wa的代码,原因是,我的写法是每次找出边是偶数的,删掉,再继续,仔细思考找到了可以把我wa的样例:

先删1的话,会导致输出“NO”

#include <iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<deque>
#include<vector>
#include<queue>
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
vector<int>v[];
bool us[];
int in[];
queue<int>q;
int main()
{
int n;
cin>>n;
memset(us,,sizeof(us));
memset(in,,sizeof(in));
while(!q.empty()) q.pop();
for(int i=;i<=n;i++)
{
int x;
cin>>x;
if(x!=)
{
v[x].push_back (i);
v[i].push_back (x);
in[i]++;
in[x]++;
}
}
if(n%==) cout<<"NO"<<endl;
else
{
while()
{
int k=-;
for(int i=;i<=n;i++)
{
if(!us[i]&&in[i]%==)
{
k=i;
break;
}
}
if(k==-) break;
q.push(k);
us[k]=;
for(int j=;j<v[k].size ();j++)
{
int y=v[k][j];
if(us[y]) continue;
in[y]--;
}
}
bool f=;
for(int i=;i<=n;i++)
{
if(!us[i])
{
f=;
break;
}
}
if(!f) cout<<"NO";
else
{
cout<<"YES"<<endl;
while(!q.empty ())
{
cout<<q.front()<<endl;
q.pop();
}
}
}
return ;
}

CodeForces - 963B Destruction of a Tree (dfs+思维题)的更多相关文章

  1. codeforces 963B Destruction of a Tree

    B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input stan ...

  2. Codeforces 963B Destruction of a Tree 思维+dfs

    题目大意: 给出一棵树,每次只能摧毁有偶数个度的节点,摧毁该节点后所有该节点连着的边都摧毁,判断一棵树能否被摧毁,若能,按顺序输出摧毁的点,如果有多种顺序,输出一种即可 基本思路: 1)我一开始自然而 ...

  3. codeforces 812E Sagheer and Apple Tree(思维、nim博弈)

    codeforces 812E Sagheer and Apple Tree 题意 一棵带点权有根树,保证所有叶子节点到根的距离同奇偶. 每次可以选择一个点,把它的点权删除x,它的某个儿子的点权增加x ...

  4. Codeforces 878D - Magic Breeding(bitset,思维题)

    题面传送门 很容易发现一件事情,那就是数组的每一位都是独立的,但由于这题数组长度 \(n\) 很大,我们不能每次修改都枚举每一位更新其对答案的贡献,这样复杂度必炸无疑.但是这题有个显然的突破口,那就是 ...

  5. XJOI3363 树3/Codeforces 682C Alyona and the Tree(dfs)

    Alyona decided to go on a diet and went to the forest to get some apples. There she unexpectedly fou ...

  6. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)

    D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Gym101246G:Revolutionary Roads(DFS+思维)

    http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...

  8. codeforces 799 D. Field expansion(dfs+思维剪枝)

    题目链接:http://codeforces.com/contest/799/problem/D 题意:给出h*w的矩阵,要求经过操作使得h*w的矩阵能够放下a*b的矩阵,操作为:将长或者宽*z[i] ...

  9. codeforces 682C Alyona and the Tree DFS

    这个题就是在dfs的过程中记录到根的前缀和,以及前缀和的最小值 #include <cstdio> #include <iostream> #include <ctime ...

随机推荐

  1. 将VS2010环境设置为VC6.0样式(字体、前景色、背景色、Visual Assist X等)

    一.设置字体. 使用字体:Fixedsys Excelsior 3.01. 步骤1:下载字体. 步骤2:安装字体,控制面板->字体,复制下载的字体进去. 步骤3:打开VS2010,选择菜单:To ...

  2. 状态保持: cookier及session简介

    状态保持 因为 http 是一种无状态协议,浏览器请求服务器是无状态的. 无状态:指一次用户请求时,浏览器.服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求. 无状态原因:浏览器与服务器是 ...

  3. JQuery强大的操控标签能力

    jquery选择器 $("#myId")          选择id为myId的元素 $(".myClass")     选择class为myClass的元素 ...

  4. JQ上传预览+存数据库

    因为之前老师讲的方法有不少BUG 现在经过完善已经修复 之前老是讲的方法是每一张都会被传到后台文件夹里面去 导致在预览过程中如果刷新页面 那么预览的图片不能从后台文件夹中删除  这个方法实现在本地预览 ...

  5. Spring AOP的使用报错!

    用构造方法注入的时候 需要把无参构造方法手动加上 AOP底层会调用无参构造方法. 不加则报错:Superclass has no null constructors but no arguments ...

  6. 用位运算替代js中的常见操作

    一.补码 所谓补码就是所有位取反: 例如3的二进制表示是:00000011,那么3的补码就是11111100: 对于-3的二进制表示就是3的补码+1:11111101: 所以二进制的负数就是该数的补码 ...

  7. [Scala]Scala学习笔记四 类

    1. 简单类与无参方法 class Person { var age = 0 // 必须初始化字段 def getAge() = age // 方法默认为公有的 } 备注 在Scala中,类并不声明为 ...

  8. matlab save 命令

    有时候要运行很长才得到结果,而这部分结果在后面修改代码之后不需要改变.可以多次利用这些结果or参数,有必要将结果保存下来. 1 save example1 A ;%A为当前环境下的变量,example ...

  9. iOS开发错误汇总

    人非圣贤孰能无过 dyld: Library not loaded: /... 过而能改善莫大焉 iOS下dyld: Library not loaded: 错误信息解决方案

  10. Win32 程序在启动时激活前一个启动程序的窗口

    UWP 程序天生单实例.当然,新 API (10.0.17134)开始也提供了多实例功能.不过,传统 Win32 程序可就要自己来控制单实例了. 本文介绍简单的几个 Win32 方法调用,使 Win3 ...