1004. Counting Leaves (30) 解析和记录

题目就不贴了,思路如下:

1.定义一个类:主要有vector<int> child 和 colour组成;child 用来存储该节点的子代,colour 用来标记叶子(WHITE)和中间节点(BLACK)。

2.由于 0 < N < 100, 为了简化计算定义类数组来进行寻址,注意数组大小可以定义成101,方便直接从1开始寻址

3.输入数据,用类数组的数据结构来表示这颗树,并对节点进行着色,将子代放入vector

4.通过BFS广度优先思想来遍历这颗树,用队列queue来实现广度优先算法,其算法复杂度为O(N)

坑点:

第三个测试用例,如果不注意1 0的输入会判错的,因为只输入一个根节点,所以应该输出 1;

代码如下:

#include <iostream>
#include <vector>
#include <sstream>
#include <queue>
#include <cstring>

#define WHITE 0
#define BLACK 1
#define MAX_NODE 500
using namespace std;

struct node{
	vector<int> child;
	int colour;
	node(): colour(WHITE) {}
};

queue<int> list;
int n_n;
int m_n;
node array[MAX_NODE];

int main(void)
{
	string line;
	while(getline(cin, line))
	{
		/*input*/
		int record;	
		stringstream sss(line);
		sss >> n_n;
		if(n_n == 1)
		{
			cout << 1 << "\n";
			continue;
		}
		sss >> m_n;
		memset(array, 0, sizeof(node) * MAX_NODE);
		for(int i = 0; i < m_n; i++)
		{
			int id;
			int k;
			getline(cin, line);
			stringstream ss(line);
			ss >> id;
			ss >> k;
			for(int j = 0; j < k; j++)
			{
				int temp;
				ss >> temp;
				array[id].child.push_back(temp);
				array[id].colour = BLACK;
			}

		}

		/*process*/
		record = 1;
		list.push(1);
		cout << 0;
		while(!list.empty())
		{
			int times = 0;
			int next_record = 0;
			for(int j = 0; j < record; j++)
			{
				int temp;
				temp = list.front();
				list.pop();
				for(unsigned int i = 0; i < array[temp].child.size(); i++)
				{
					if(array[array[temp].child[i]].colour ==  BLACK)
					{
						list.push(array[temp].child[i]);
						next_record++;
					}
					else
						times++;
				}
			}
			record  = next_record;
			cout << " " << times;
		}
		cout << "\n";
	}

	return 0;
}




阅读更多

没有更多推荐了,返回首页