Tree Constructer
Tree Constructer
https://ac.nowcoder.com/acm/contest/10662/J
#include <bits stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; ++i)
using namespace std;
typedef unsigned long long ll;
const int N = 1e2 + 7;
ll m = 1LL << 59;
vector<int> g[N], x[2];
ll w[N], pos[N];
void dfs(int u, int fa, int c) {
x[c].push_back(u);
for (int v : g[u])
if (v != fa) dfs(v, u, 1 - c);
}
int main() {
int n, u, v;
scanf("%d", &n);
rep(i, 2, n) {
scanf("%d%d", &u, &v);
g[v].push_back(u);
g[u].push_back(v);
}
dfs(1, 1, 0);
// 黑白染色 :树是二分图
if (x[0].size() > x[1].size()) swap(x[0], x[1]);
// 树作为二分图时 可以保证 黑白至少有一边点数量在 [1,n/2] 范围内
for (int i = 0, v; i < x[0].size(); ++i) {
v = x[0][i];
pos[v] = i; // 不重复
w[v] = m - 1; // 初始化为58位的全1串
w[v] ^= (1LL << i); // 每个白点的值都是不一样的 : 将 第i位 置零
}
// 因为白点的值的唯一,黑点的值也是唯一的
for (int u : x[1]) { // 遍历黑点
w[u] = m; // 59位10000000串
for (int v : g[u]) w[u] |= (1LL << pos[v]); // 如果儿子没有 就置位
}
rep(i, 1, n) cout << w[i] << ' ';
return 0;
}
```</int></bits>
算法竞赛之路 文章被收录于专栏
整理、记录算法竞赛的好题