PAT甲级 1004.Counting Leaves

参考:https://blog.csdn.net/qq278672818/article/details/54915636

首先贴上我一开始的部分正确代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e4+5;
 4 struct node
 5 {
 6     int level,child;//level为该节点层数,child为该节点孩子数
 7     node()
 8     {
 9         level=10000;
10         child=0;
11     }
12 }no[N];
13 int n,m;
14 int ans[N];//ans【i】为第i层叶子节点数
15 int cmp(struct node x,struct node y)
16 {
17     return x.level<y.level;
18 }
19 int main()
20 {
21     cin>>n;
22     if (n==0)
23         return 0;
24     cin>>m;
25     no[1].level=1;
26     int k,id,child,maxlevel=1;//maxlevel为最大层数
27     for (int i=0;i<m;i++)
28     {
29         cin>>id>>k;
30         no[id].child=k;
31         for (int i=0;i<k;i++)
32         {
33             cin>>child;
34             no[child].level=no[id].level+1;
35             maxlevel=max(maxlevel,no[child].level);
36         }
37     }
38     sort(no+1,no+1+n,cmp);//按层数排序
39     memset(ans,0,sizeof(ans));
40     for (int i=1;i<=n;i++)
41     {
42         if (no[i].child==0)
43         {
44             ans[no[i].level ]++;
45         }
46     }
47     cout<<ans[1];
48     for (int i=2;i<=maxlevel;i++)
49         cout<<" "<<ans[i];
50     cout<<endl;
51 
52     return 0;
53 }

经参考了上边的参考链接后发现:若有测试点是无序的,则该解法错误,因为节点的层数设置将不正确。

再贴上AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector<int> ve[110];
 4 int n,m,maxlevel=0;//maxleve记录树的最大层数
 5 int ans[110];//ans[i]保存第i层的叶子节点数
 6 void dfs(int level,int id)//level为当前层数,id为当前节点编号
 7 {
 8     if (ve[id].size()==0)//找到叶子节点
 9     {
10         maxlevel=max(maxlevel,level);
11         ans[level]++;
12         return;
13     }
14     for (int i=0;i<ve[id].size();i++)//递归遍历孩子节点
15     {
16         dfs(level+1,ve[id][i]);
17     }
18 }
19 int main()
20 {
21     cin>>n;
22     if (n==0)
23         return 0;
24     cin>>m;
25     int id,k,child;
26     for (int i=0;i<m;i++)
27     {
28         cin>>id>>k;
29         for (int j=0;j<k;j++)
30         {
31             cin>>child;
32             ve[id].push_back(child);
33         }
34     }
35     memset(ans,0,sizeof(ans));
36     dfs(0,1);
37     cout<<ans[0];
38     for (int i=1;i<=maxlevel;i++)
39     {
40         cout<<" "<<ans[i];
41     }
42     cout<<endl;
43 
44     return 0;
45 }

 

posted @ 2019-04-11 22:39  hemeiwolong  阅读(171)  评论(0编辑  收藏  举报