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 }