社区讨论
T2 求调,20pts,悬1关(小号),调的时候麻烦@一下
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhji150k
- 此快照首次捕获于
- 2025/11/04 02:54 4 个月前
- 此快照最后确认于
- 2025/11/04 02:54 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int T, n, m, f[10005][20], dep[10005], num[10005];
vector<int> g[10005];
int kthfa(int u, int k) {
while (k) {
u = f[u][__lg(k)];
k -= (1 << __lg(k));
}
return u;
}
void dfs(int u, int fa) {
dep[u] = dep[fa] + 1;
f[u][0] = fa;
for(int i = 1; i <= __lg(dep[u]); i++)
f[u][i] = f[f[u][i - 1]][i - 1];
for (auto v : g[u])
if (v != fa)
dfs(v, u);
num[kthfa(u, dep[u] - (dep[u] + 1) / 2)]++;
}
struct Node {
int u;
bool operator < (const Node &x) const {
return num[u] < num[x.u];
}
};
priority_queue<Node> q;
bitset<10005> vis;
void bfs() {
q.push({ 1 });
int t = n;
while (!q.empty()) {
int u = q.top().u;
q.pop();
if (vis[u])
continue;
vis[u] = 1;
for (int i = num[u]; i; i--)
cout << t << " ";
for (auto v : g[u])
q.push({ v });
t--;
}
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
vis.reset();
memset(num, 0, sizeof num);
for (int i = 1; i <= n; i++)
g[i].clear();
for (int i = 1, u, v; i < n; i++) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
bfs();
puts("");
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...