看大家都写的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;
}