PAT Grade A Brushing Record-1004 Conteo de hojas (30 puntos)

Una jerarquía familiar generalmente es presentada por un árbol genealógico. Su trabajo es contar a los miembros de la familia que no tienen hijos.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Cada caso comienza con una línea que contiene 0 <N <100, el número de nodos en un árbol, y M (<N), el número de nodos no hoja. Luego siguen las líneas M, cada una en el formato:

ID K ID[1] ID[2] ... ID[K]

donde IDes un número de dos dígitos que representa un nodo no hoja dado, Kes el número de sus hijos, seguido de una secuencia de dos dígitos IDde sus hijos. En aras de la simplicidad, arreglemos la ID raíz 01.
La entrada termina con N siendo 0. Ese caso NO debe ser procesado.

Especificación de salida:

Para cada caso de prueba, se supone que debe contar los miembros de la familia que no tienen hijos para cada nivel de antigüedad desde la raíz. Los números deben imprimirse en una línea, separados por un espacio, y no debe haber espacio adicional al final de cada línea.
El caso de muestra representa un árbol con solo 2 nodos, donde 01está la raíz y 02es su único hijo. Por lo tanto, en el 01nivel raíz , hay un 0nodo hoja; y en el siguiente nivel, hay un 1nodo hoja. Entonces deberíamos salir 0 1en una línea.

Entrada de muestra:

2 1
01 1 02

Salida de muestra:

0 1

Ideas

La idea de este tema es muy simple, es decir, use DFS o BFS para buscar (usé DFS aquí), si es un nodo hoja, luego regrese y proporcione el nivel correspondiente [el número de nodos hoja actuales] ++, si no Nodo de hoja, luego busque todos sus nodos secundarios,Primero trate con el nivel del nodo secundario y actualice el valor máximo de nivel máximo, Y luego realice una búsqueda DFS en cada nodo secundario. Una vez completada la búsqueda, los valores del nivel de matriz se pueden generar en orden.
Hay un pequeño problema en esta pregunta, es decir, puede estar desordenado al ingresar, como la situación actual: los
Inserte la descripción de la imagen aquí
nodos no hoja son obviamente 01 y 03. Si ingresa 01 y 03 en orden, entonces creo que la mayoría El código no es un problema, todo puede ser AC, pero no dice esta pregunta, es decir, puede haber un desorden en la entrada (aquí para recordarlo:Si encuentra una situación parcialmente correcta, intente ingresar los datos de prueba al revésEn muchos casos, es causada por no considerar el trastorno (WA), es decir, ingrese 03 y luego 01. Por lo tanto, cuando especificamos el nivel de cada nodo, no podemos especificarlo al ingresar datos. Bueno (solo en el caso de una secuencia positiva se puede procesar al ingresar datos; de lo contrario, la entrada viene primero con un subnodo, y el número de subnodos es el número de subnodos más 1, lo cual no es problema, pero ¿Cuál es el número de capas del nodo en sí? Es imposible saberlo).
Por lo tanto, cuando ingresamos datos, solo debemos tratar con la relación padre-hijo entre los nodos, y luego procesar la relación entre el número de capas entre el padre y el hijo al realizar la búsqueda DFS (Una vez que se hayan almacenado todos los datos, no habrá errores al procesar la jerarquía, ya sea que se trate de una entrada fuera de orden o una entrada de orden positiva.)。

Código

#include<cstdio> 
#include<string>
#include<vector>
#include<iostream>
using namespace std;
const int maxn = 1010;
struct node{
	int deep;
	vector<int> child;
	node(){
		deep = 1;
		child.clear();
	}
}Node[maxn];
vector<int> node[100];//记录当前结点和孩子结点
int level[maxn] = {0};//用于存放当前层的叶子结点数 
void dfs(int id, int &maxlevel){
	if(Node[id].child.size()==0){//size为0就说明没孩子,即叶子结点
		level[Node[id].deep]++;//当前层的叶子数目+1 
		return;
	}
	for(int i=0;i<Node[id].child.size();i++){
		Node[Node[id].child[i]].deep = Node[id].deep + 1;//孩子的deep是父亲的deep+1 
		if(Node[Node[id].child[i]].deep>maxlevel) maxlevel = Node[Node[id].child[i]].deep;//更新最大深度
		dfs(Node[id].child[i], maxlevel);//dfs每个孩子 
	}
}
int main(){
	int N, M;
	scanf("%d%d", &N, &M);
	if(N==0) return 0;
	Node[1].deep = 1;//初始化根结点 
	Node[1].child.clear();
	int maxlevel = 1;
	while(M--){
		int id, k;
		scanf("%d%d", &id, &k);
		while(k--){
			int tmpid;
			scanf("%d", &tmpid);
			Node[id].child.push_back(tmpid);//放入孩子结点
		}
	}
	dfs(1, maxlevel);
	for(int i=1;i<=maxlevel;i++){
		if(i==1) printf("%d", level[i]);
		else printf(" %d", level[i]);
	}
    return 0;
}
Publicado 54 artículos originales · ganó 27 · vistas 4971

Supongo que te gusta

Origin blog.csdn.net/weixin_42257812/article/details/105595076
Recomendado
Clasificación