PAT 1004

https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184

看到这个题目,马上就想到了广搜。但是需要单独开一个数组,用来区分每个点属于哪一个层,同时记录每个层叶节点个数。

下面是 bfs的:

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<string.h>
using namespace std ;

int level[100];//一开始不知道所在的层数,因此需要level用来记录区分
int Count[100];//记录每层的个数
vector<int> Link[100] ;
int maxlevel = -1 ;
void bfs(){
    queue<int> que ;
    que.push(1);
    level[1] = 1 ;
    while(!que.empty())
    {
        int index = que.front();
        que.pop();
        maxlevel = max(maxlevel,level[index]);
        if(Link[index].size()==0)
        {
            Count[level[index]] ++;
        }else {
            for(int i = 0 ; i < Link[index].size(); i ++)
            {
                level[Link[index][i]] = level[index]+1;
                que.push(Link[index][i]);
            }
        }

    }
}
int main(){
    int n , m , node, num , to;
    for(int i = 0 ; i < 100 ; i ++)
    {
        Link[i].clear();
    }
    memset(Count,0,sizeof(Count));
    cin >> n >> m ;
    maxlevel =-1 ;
    for(int i = 0 ; i < m ; i ++)
    {
        cin >> node >> num;
        for(int i = 0 ; i < num ; i ++)
        {
            cin >> to ;
            Link[node].push_back(to);
        }
    }
    bfs();
    printf("%d",Count[1]);
    for(int i = 2 ; i <=maxlevel ; i ++ )
    {
        printf(" %d",Count[i]);
    }
    printf("\n");
    return 0 ;

}

下面是 dfs的,在dfs里直接记录一个depth,就可以记录层数。也很简单。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

vector<int> v[100];
int book[100];
int maxDepth=-1; 

void dfs(int index,int depth){
    // 此时第index结点已经没有子结点了,则表明是叶子结点 
    if(v[index].size()==0){
        // 统计该叶子结点 
        book[depth]++;
        // 更新最大层次 
        maxDepth = max(maxDepth,depth);
        return ;
    }
    // 递归调用 
    for(int i=0;i<v[index].size();i++){
        dfs(v[index].at(i),depth+1);
    }
} 
int main(){
    int N,M;
    int node,K;
    while(cin>>N>>M){
        for(int i=0;i<M;i++){
            cin>>node>>K;
            for(int j=0;j<K;j++){
                int temp;
                cin>>temp;
                v[node].push_back(temp);
            }
        }

        // 从第一个结点开始,第零层 
        dfs(1,0);

        cout<<book[0];
        for(int i=1;i<=maxDepth;i++){
            cout<<" "<<book[i];
        } 
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值