题目链接:http://codeforces.com/contest/963/problem/B
n为偶数一定不可以
n为奇数的时候贪心每次删除每个子树最深的偶数节点
贪心太难辣!
代码:
#include<bits/stdc++.h> #define pb push_back using namespace std; const int MAXN=2e5+5; vector<int> E[MAXN],ans; int p[MAXN]; bool vis[MAXN]; void dfsans(int x) { vis[x]=true; printf("%d\n",x); for(auto v:E[x]) { if(!vis[v]) dfsans(v); } } void dfs(int x,int fa) { for(auto v:E[x]) { if(!vis[v]) dfs(v,x); } int in=0; for(auto v:E[x]) { if(!vis[v]) in++; } if(fa) in++; if(in%2==0) { dfsans(x); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n,rt; scanf("%d",&n); if(!(n&1)) return 0*puts("NO"); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); if(p[i]==0) rt=i; else E[p[i]].pb(i); } puts("YES"); dfs(rt,0); return 0; }