PAT(甲级)渡劫(五)-The Largest Generation (25)

PAT(甲级)渡劫(五)-The Largest Generation (25)

题目大意:

就是统计一下每层的节点数,输出节点数最多的个数和对应的层数即可。

算法思想:

采用层次遍历

代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int maxn = 105;
const int inf = 1e9;
vector<int> graph[maxn];    // 邻接表
bool vis[maxn];             // 访问标记数组

int lev = 1;                // 记录层次数
int sum = 0;                    // 记录每层的结点个数
int ans = 1;    //

void BFS(int s){
    queue<int> q;
    q.push(s);      // 将根结点入队列
    vis[s] = true;
    int tail;
    int last = s;   // 记录队列的最后一个结点
    int cnt = 1;
    while(q.empty() == false){
        int k = q.front();
        q.pop();
        int n = graph[k].size();
        for(int i = 0 ; i < n ; i++){
            if(!vis[graph[k][i]]){
                q.push(graph[k][i]);
                vis[graph[k][i]] = true;
                tail = graph[k][i]; // 记录该层最后一个结点的编号
                sum++;              // 结点个数加1
            }
        }
        if(k == last){  // 若该层遍历完毕
            last = tail;    // 更新队列的最后一个结点
            cnt++;      // 层数加一
            if(ans < sum){  // 求每层中最多的结点个数,并记录他的层数
                ans = sum;
                lev = cnt;
            }
            sum = 0;    // 每层结点个数重新计数
        }
    }
}

int main(){
    int n,m,k,t;
    // freopen("in.txt","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i = 0 ; i < m ; i++){
        int id;
        cin>>id>>k;
        for(int j = 0 ; j < k ; j++){
            cin>>t;
            graph[id].push_back(t);
            graph[t].push_back(id);
        }
    }
    BFS(1);
    printf("%d %d\n",ans,lev);

    return 0;
}
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值