首页 > 其他 > 详细

1004 Counting Leaves (30分)

时间:2020-03-09 09:27:58      阅读:74      评论:0      收藏:0      [点我收藏+]

 

技术分享图片

知识点:bfs

有大神用dfs写的好像简单一些?不管了。这题大概意思是,N个节点,M个非叶节点(内部节点),且给出M行信息,每行的信息是“内部节点的编号  该节点的孩子数目  该节点的所有孩子编号”,根节点编号为01。输出每层的内部节点个数。

思路:

建图;

用bfs遍历节点,在这过程中记录节点的层数(本题关键);

建立二维数组data,data[i]存有第i层的所有节点的编号;

逐层检查节点是否有孩子,没有孩子的节点数目为该层的内部节点数;

输出结果。

(如果只有一个节点,即输入1 0,输出的是1...)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<queue> 
 5 #include<algorithm>
 6 using namespace std;
 7 int main(){  
 8           int N,M;
 9           scanf("%d%d",&N,&M);
10           
11           int Node[N+1]={0};//Node[i]表示第i个顶点的层数 
12           Node[1]=1;        //编号为1的顶点层数为1 
13           vector<vector<int> >Edge(N+1);//图的边数组 
14           
15           int id,K,child_id;
16           for(int i=0;i<M;i++){
17               scanf("%d%d",&id,&K);
18               for(int j=0;j<K;j++){
19                   scanf("%d",&child_id);
20                   Edge[id].push_back(child_id);
21               }
22           }
23     
24        queue<int> Q;
25        Q.push(1); 
26        int count=1; 
27        while(!Q.empty()){
28            int v=Q.front();
29            Q.pop();
30            for(int i=0;i<Edge[v].size();i++) {   
31                Q.push(Edge[v][i]);
32                Node[Edge[v][i]]=Node[v]+1;
33                if(count<Node[v]+1)
34                   count=Node[v]+1;
35            }
36        }
37           
38           vector<vector<int> >data(count+1);
39           for(int i=1;i<=N;i++)
40           {
41                data[Node[i]].push_back(i);
42           }
43        int result[count]={0};
44        int num;  
45           for(int i=1;i<=count;i++)
46           {
47               num=0;
48               for(int j=0;j<data[i].size();j++)
49               {
50                   if(Edge[data[i][j]].empty())
51                       num++;
52               }
53               
54               result[i-1]=num;
55               
56           }
57           for(int i=0;i<count;i++)
58           {
59               if(i==count-1)
60                 printf("%d",result[i]);
61                 else
62               printf("%d ",result[i]);
63           }
64 return 0;
65 }

 

1004 Counting Leaves (30分)

原文:https://www.cnblogs.com/wsshub/p/12446128.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!