T271299 [CoE R5] So What Do We Do Now?
[CoE R5] So What Do We Do Now?
题目背景
声明:上述图片取自网络,作者不明,如有侵权,告知即删。
题目描述
给定一棵
其中
对于所有的赋点权的方式,请求出一组使
输入格式
第一行一个正整数
接下来
输出格式
第一行一个
样例 #1
样例输入 #1
3
1 2
1 3
样例输出 #1
1 2 3
样例 #2
样例输入 #2
2
1 2
样例输出 #2
1 2
样例 #3
样例输入 #3
5
1 2
2 3
3 4
4 5
样例输出 #3
1 2 3 4 5
提示
样例说明
输入
数据范围
对于
对于另外
对于另外
对于另外
对于
思路
树上
由于存答案时一棵子树的答案长度和子树大小相等,所以计算每个子树时,每算完一个子树,就要把开始存答案的位置加上子树大小。
然后就没有然后了。
代码
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1000010,M = 2 * N;
int n;
int h[N],e[M],ne[M],idx;
int s[N];
int ans[N];
void add (int a,int b) { //链式前向星
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void get_size (int u,int fa) { //这里传入父亲是防止死递归
s[u] = 1;
for (int i = h[u];~i;i = ne[i]) {
int j = e[i];
if (j == fa) continue;
get_size (j,u);
s[u] += s[j]; //加上子树大小
}
}
void dfs (int u,int fa,int add) {
ans[u] = add + 1; //先存答案
int t = add + 1; //要加1,因为当前点已经存了数
for (int i = h[u];~i;i = ne[i]) {
int j = e[i];
if (j == fa) continue;
dfs (j,u,t);
t += s[j]; //到下一个位置
}
}
int main () {
memset (h,-1,sizeof (h));
cin >> n;
for (int i = 1;i <= n - 1;i++) {
int a,b;
cin >> a >> b;
add (a,b),add (b,a);
}
get_size (1,0),dfs (1,0,0);
for (int i = 1;i <= n;i++) cout << ans[i] << ' ';
cout << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现