专栏文章
题解:P11962 [GESP202503 六级] 树上漫步
P11962题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miptsmrh
- 此快照首次捕获于
- 2025/12/03 17:49 3 个月前
- 此快照最后确认于
- 2025/12/03 17:49 3 个月前
在一棵树上移动 步,一定会使深度改变 ,所以移动 步,深度的改变为 或 ,所以移动偶数步,深度改变量一定是偶数。
那么可以将深度为奇数的点分为一类,深度为偶数的点分为一类,此时每一类中的点是可以用偶数步互相到达的,而不同类的点无法通过偶数步到达,所以只要统计深度为奇数的点的个数 ,那么所有深度为奇数的点输出 ,否则输出 。时间复杂度为 。
CPP#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+1;
int n, u, v, dep[N], sum;
bool vis[N];
vector<int> e[N];
void dfs(int u){
vis[u] = 1;
if (dep[u] % 2) sum++;
for(auto v:e[u]){
if (vis[v]) continue;
dep[v] = dep[u] + 1;
dfs(v);
}
vis[u] = 0;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1);
for(int i=1;i<=n;i++){
if (dep[i] % 2) cout << sum;
else cout << n-sum;
cout << ' ';
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...