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. 【PL/SQL编程】块结构

    [DECLARE] --声明部分,可选 BEGIN --执行部分,必须 [EXCEPTION] --异常处理部分,可选 END

  2. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  3. TF随笔-7

    求平均值的函数 reduce_mean axis为1表示求行 axis为0表示求列 >>> xxx=tf.constant([[1., 10.],[3.,30.]])>> ...

  4. [置顶] 普通程序员如何入门AI

    毫无疑问,人工智能是目前整个互联网领域最火的行业,随着AlphaGo战胜世界围棋冠军,以及各种无人驾驶.智能家居项目的布道,人们已经意识到了AI就是下一个风口.当然,程序员是我见过对于新技术最敏感的一 ...

  5. 数据链路层、ARP/RARP、ICMP、ping和traceroute

    互联网基础:   数据链路层:RFC文档:894/1042/1340 为IP模块发送和接受IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答   ...

  6. huawei机试题目

    1/*输入一个字符串,输出这个字符串中单词的字典排序*/ bool cmp(char* a,char* b){ ? true:false; } void sortWord(char* str) { v ...

  7. selenium-java,UI自动化截图方法

    截图方法: import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; impor ...

  8. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  9. ubuntu 安装nodejs/npm

    安装发行稳定版 Ubuntu 默认仓库里带有Node.js,版本较旧,这并不是最新版,但是应该很稳定.执行如下命令:   1 2 sudo apt-getupdate sudo apt-getinst ...

  10. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...