思路:
可以证明,当一个子树大小为a或b时就可以构造。
那就构造喽。
c o d e code code
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int n, a, b, ans[MAXN], tot, cnt;
int size[MAXN];
vector<int> e[MAXN];
void dfs(int x, int fa) {
size[x] = 1;
for(int i = 0; i < e[x].size(); i ++) {
int y = e[x][i];
if(y == fa) continue;
dfs(y, x);
size[x] += size[y];
}
}
void dfs_a(int x, int fa) {
for(int i = 0; i < e[x].size(); i ++) {
int y = e[x][i];
if(y == fa) continue;
dfs_a(y, x);
}
ans[x] = ++ tot;
}
void dfs_b(int x, int fa) {
for(int i = 0; i < e[x].size(); i ++) {
int y = e[x][i];
if(y == fa) continue;
dfs_b(y, x);
}
ans[x] = -- cnt;
}
void bfs(int s, int t) {
dfs_a(s, t);
dfs_b(t, s);
for(int i = 1; i <= n; i ++) printf("%d\n", ans[i]);
}
void dp(int x, int fa) {
for(int i = 0; i < e[x].size(); i ++) {
int y = e[x][i];
if(y == fa) continue;
if(a == size[x] - size[y] && b == size[y]) { bfs(x, y); exit(0); }
if(a == size[y] && b == size[x] - size[y]) { bfs(y, x); exit(0); }
int g = size[x], p = size[y];
size[x] -= size[y];
size[y] = g;
dp(y, x);
size[x] = g;
size[y] = p;
}
}
int main() {
scanf("%d%d%d", &n, &a, &b);
for(int i = 1; i < n; i ++) {
int x, y;
scanf("%d%d", &x, &y);
e[x].push_back(y);
e[y].push_back(x);
}
if(a == 0) {
bfs(0, 1);
exit(0);
}
if(b == 0) {
bfs(1, 0);
exit(0);
}
dfs(1, 0);
dp(1, 0);
printf("-1");
return 0;
}