当前位置: 代码迷 >> 综合 >> PAT 1004 Counting Leaves 结构体法
  详细解决方案

PAT 1004 Counting Leaves 结构体法

热度:56   发布时间:2023-11-24 11:46:43.0

PAT 1004 Counting Leaves 结构体法

#include <stdio.h>
int main()
{
    struct node{
    int c;//子节点数目;int la;//该节点在第几层;int v;//该节点是否被访问;int str[100];//子节点的名称;}cl[105];int n;scanf("%d",&n);if(n==0)return 0;int m;scanf("%d",&m);if(n==1&&m==0){
    printf("1");return 0;}int x[105]={
    0},i,j;for(i=0;i<100;i++){
    cl[i].c=0;cl[i].la=0;cl[i].v=0;}int t,b;for(i=0;i<m;i++){
    scanf("%d %d",&t,&b);cl[t].c=b;//用结构体下标表明节点名称;cl[t].v=1;//该节点存在;int q;for(j=0;j<cl[t].c;j++){
    scanf("%d",&q);//输入子节点;cl[t].str[j]=q;cl[q].v=1;}}for(i=0;i<cl[1].c;i++)cl[cl[1].str[i]].la=1;//第一层根节点及其子节点的层数设置好;for(i=1;i<100;i++){
    if(cl[i].v==1){
    for(j=0;j<cl[i].c;j++){
    cl[cl[i].str[j]].la=cl[i].la+1;//之后每一层都满足子节点比父节点多一层;}}}int max=0,k;for(i=0;i<100;i++){
    if(cl[i].c==0&&cl[i].v==1) {
    k=cl[i].la;x[k]++;}//预处理计算每一层没有孩子节点的节点数目;if(cl[i].la>max) max=cl[i].la;//max代表层数-1;(第一层从零开始设置的)}for(i=0;i<=max;i++){
    if(i!=max) printf("%d ",x[i]);if(i==max) printf("%d",x[i]);}}