PAT 1094

题目

PAT 1094

考察点

BFS/DFS求树的深度

思路

这里要注意一个问题就是,当假设给出的数据为
2 1
01 1 02
这种数据时,我们要输出的是第一层的个数1,而非第二层的个数1,
因此在代码实现过程中,要注意题目默认的排序规则是层数结点个数相同时,按照层数递增进行输出

代码

/*
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 *                                                                                                 
 * Blog: https://blog.csdn.net/weixin_41234001                                      
 *                                                                                                 
 * Author: DoBetter                                                               
 *                                                                                                 
 * Time: 2019.11.30                                                                            
 *                                                                                                 
 * Describe: BFS求树的那一层结点数最多,并输出结点数和层号                                            
 *                                                                                                 
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 */
//读题10min
#include <iostream>
#include <algorithm>
#include <vector>
#include<queue>
using namespace std;
//定义树
const int maxn = 110;
struct node
{
	int layer;//记录层数
	vector<int> child;
}Node[maxn];
int Depth[maxn];//记录每层所对应的结点数
//int layer = 1;
int maxLayer = 0;
void BFS(int index);
int main()
{
	//输入
	int N, M;
	scanf("%d%d",&N ,&M);
	//构造树
	for (int i=0;i<M;i++)
	{
		int ID, K;
		scanf("%d%d", &ID, &K);
		for (int j=0;j<K;j++)
		{
			int child;
			scanf("%d", &child);
			Node[ID].child.push_back(child);
		}
	}
	Node[1].layer = 1;
	BFS(1);
	//输出最大层和层号
	int indexLayer = 1;
	Depth[1] = 1;
	for (int i=2;i<=maxLayer;i++)
	{
			if (Depth[i]>Depth[indexLayer])
			{
				indexLayer = i;
			}
	}
	cout << Depth[indexLayer] << " " << indexLayer;
	return 0;
}
void BFS(int index) 
{
	queue<int> Q;
	Q.push(index);//根节点入栈
	while (!Q.empty())
	{
		int front = Q.front();
		Q.pop();//首结点出队
		int layer = Node[front].layer + 1;
		if (Node[front].child.size()!=0)
		{
			if (layer > maxLayer)
			{
				maxLayer = layer;
			}
			Depth[layer] += Node[front].child.size();
		/*	cout <<"Depth[layer]" <<Depth[layer]<<"layer"<<layer<< endl;*/
		}
		
		for (int i=0;i<Node[front].child.size();i++)
		{
			int child = Node[front].child[i];
			Node[child].layer = layer;
			Q.push(Node[front].child[i]);//子结点入队
		}
	}
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值