Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2) D. Destruction of a Tree

D. 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;
const int maxn=200005;
int u[maxn],par[maxn];
bool vis[maxn];
vector<int>rode[maxn];
stack<int>P;//存储遍历顺序
queue<int>Q;
void dfs(int v,int pre)
{
    P.push(v);par[v]=pre;
    for(int i=0;i<rode[v].size();i++)
    {
        if(rode[v][i]==pre)continue;
        dfs(rode[v][i],v);
    }
}
void dfs2(int x)
{
    Q.push(x);vis[x]=1;
    for(int i=0;i<rode[x].size();i++)
    {
        int to=rode[x][i];
        u[to]--;
        if(to==par[x]||vis[to])continue;
        if(u[to]%2==0)
            dfs2(to);
    }
}
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;scanf("%d",&x);
        if(x)
        {
            rode[i].push_back(x),rode[x].push_back(i);
            u[i]++,u[x]++;
        }
    }
    dfs(1,0);
    while(!P.empty())
    {
        int x=P.top();P.pop();
        //printf("%d\n",x);
        if(u[x]%2==0)
            dfs2(x);
    }
    //printf("%d\n",Q.size());
    if(Q.size()==n)
    {
        printf("YES\n");
        while(!Q.empty())
        {
            printf("%d\n",Q.front());
            Q.pop();
        }
    }
    else printf("NO\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/albertluf/article/details/80279975