B - Christmas Spruce

B. Christmas Spruce
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Consider a rooted tree. A rooted tree has one special vertex called the root. All edges are directed from the root. Vertex u is called a child of vertex v and vertex v is called a parent of vertex u if there exists a directed edge from v to u. A vertex is called a leaf if it doesn't have children and has a parent.

Let's call a rooted tree a spruce if its every non-leaf vertex has at least 3 leaf children. You are given a rooted tree, check whether it's a spruce.

The definition of a rooted tree can be found here.

Input

The first line contains one integer n — the number of vertices in the tree (3 ≤ n ≤ 1 000). Each of the next n - 1 lines contains one integer pi (1 ≤ i ≤ n - 1) — the index of the parent of the i + 1-th vertex (1 ≤ pi ≤ i).

Vertex 1 is the root. It's guaranteed that the root has at least 2 children.

Output

Print "Yes" if the tree is a spruce and "No" otherwise.

Examples
input
4
1
1
1
output
Yes
input
7
1
1
1
2
2
2
output
No
input
8
1
1
1
1
3
3
3
output
Yes
Note

The first example:

The second example:

It is not a spruce, because the non-leaf vertex 1 has only 2 leaf children.

The third example:



题意:给你一颗有根树,n个节点,第一个节点为根节点。输入n-1行,代表从第二个节点开始的当前节点的父节点,例如样例1 ,第一个1代表2号节点父节点是1,同理,3,4号父节点也是1.于是就连接成了样例1那种树。让我们判断每个非叶子节点的叶子个数是否>=3,满足就输出yes,否则就no
题解:模拟   开个vis数组标记每个非叶子节点为1,叶子节点为0.从n到1扫一次,找叶子节点有一个叶子节点,就代表父节点有个满足条件的孩子。最后在扫一次,扫每个非叶子节点,判断它的孩子是否>=3,就满足条件。输出yes。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a[1010],vis[1010],i;
    while(cin>>n)
    {
        memset(vis,0,sizeof(vis));
        for( i=2; i<=n; i++)
            cin>>a[i],vis[a[i]]=1;///vis数组标记非叶子节点为1
        for( i=n; i>=1;i--)
            if(!vis[i]) ///找叶子节点就代表那个父节点有满足条件叶子孩子
                vis[a[i]]++;  ///非叶子节点的叶子个数++
        for(i=1; i<=n; i++)
            if(vis[i]&&vis[i]<4) ///(扫非叶子节点)小于三个叶子孩子,并且不是叶子节点,初始化为1的,所以<4
                break;
        if(i>n)
            puts("Yes");
        else   puts("No");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落凡尘.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值