洛谷:题解 CF913B 【Christmas Spruce】

这道题算式数据结构树中一个比较简单的题目了,没有什么树的遍历,只考了一个树的存储方式,模拟一遍就OK了。首先定义两个数组,分别为father数组和kids数组。father[i]表示第i个节点的父亲编号;kids是一个bool类型的数组,kids[i]表示第i个节点它是否有孩子,有就是true,木有就是false。

接下来开始读入并建树。先读入n,再读入每个节点用node,这时候就要建树了,怎么建呢?很简单,进行以下操作:father[i]=node;kids[node]=true;

建好树之后,就开始枚举每个节点了,首先判断它是否为非叶子节点,再判断它是否满足题意中的条件,即有三个是叶结点的孩子,(这里用一个循环,我用了一个函数),如果它是非叶子节点,但不满足条件,那就输出No,直接退出程序。

最后结束循环,就可以输出Yes。

总体思路就是这样,还是比较好理解的。

下面贴上简短的代码。(有注释)

#include //头文件
using namespace std;
int father[10000];//表示每个节点的父亲编号
bool kids[10000];//表示每个节点是否有孩子。
int n;
bool pd(int node)//判断函数
{
    int sum=0;
    for(int i=1; i<=n; i++)
    if(node!=i&&father[i]==node&&!kids[i])//如果第i个节点是它的儿子且这个节点是叶子节点
    {
        sum++;//sum加1
    }
    return sum>=3;//最后判断sum是否大于3
}
int main()
{
    cin>>n;//读入n
    for(int i=2; i<=n; i++)//读入每个数,注意i要从2开始
    {
        int node;
        cin>>node;//读入第i个节点编号
        father[i]=node;//第i个节点的父亲为node
        kids[node]=true;//node已经有孩子了
    }
    for(int i=1; i<=n; i++)//枚举每个节点
    {
        if(kids[i]&&!pd(i))//如果它是非叶节点且不满足条件
        {
            cout<<"No";//输出No
            return 0;//结束程序
        }
    }
    cout<<"Yes";//可以放心大胆地输出Yes
    return 0;
}

你可能感兴趣的:(洛谷题解)