BFS写蛙了两个点求助
查看原帖
BFS写蛙了两个点求助
500070
zclll楼主2021/7/23 17:54

看大家都写的DFS,想提供一种BFS的思路,从叶节点向上处理,当每个点未处理的度为1的时候证明子树全部处理完了,剩下的是父亲,就可以像DFS一样判断这个点了。但是WA在了#1和#15,求看一下是哪里没处理好:

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
#define mp(x, y) make_pair(x, y)
#define FOR(x, y, z) for (int x = y; x <= z; x++)
#define N 1000006
template <typename T>
T read()
{
	T rtn = 0;
	char ch = getchar();
	while (!isdigit(ch))
		ch = getchar();
	while (isdigit(ch))
	{
		rtn = rtn * 10 + ch - '0';
		ch = getchar();
	}
	return rtn;
}
vector<int> ans;
int n;
vector<int> nxt[N];
int edge[N];
queue<int> que;
int size[N];
int main()
{
	cin >> n;
	for (int i = 1; i < n; i++)
	{
		int x = read<int>(), y = read<int>();
		nxt[x].push_back(y);
		nxt[y].push_back(x);
		++edge[x], ++edge[y];
	}
	for (int i = 1; i <= n; i++)
		if (edge[i] == 1)
		{
			que.push(i);
			ans.push_back(i);
		}
	while (!que.empty())
	{
		auto now = que.front(); // only one next to deal
		//cout<<"now = "<<now<<endl;
		que.pop();
		size[now] = 1;
		int chdsz = 0;
		bool ok = true;
		for (auto v : nxt[now])
			if (--edge[v] == 1)
			{
				que.push(v);
				//cout<<"pushing "<<v<<endl;
			}
			else
			{
				size[now] += size[v];
				if (!chdsz)
					chdsz = size[v];
				else if (size[v] != chdsz)
					ok = false;
			}
		//cout<<"size[now] = "<<size[now]<<endl;
		if (ok && (chdsz == n - size[now] || size[now] == n))
			ans.push_back(now);
	}
	sort(ans.begin(), ans.end());
	auto ed = unique(ans.begin(), ans.end());
	for (auto it = ans.begin(); it != ed; it++)
		cout << *it << ' ';
	return 0;
}
2021/7/23 17:54
加载中...