Codeforces Round #475 (Div. 2) D. Destruction of a Tree
2024-08-29 13:39:49
题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序。
思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数条边。
那么我们对于每个父亲儿子来说, 如果儿子的子树的大小为奇数, 那么肯定先删父亲, 反之先删儿子, 建立关系图, 跑一遍拓扑序就好啦。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define ull unsigned long long
using namespace std; const int N=1e6+;
const int M=+;
const int inf=0x3f3f3f3f;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mod=1e9 + ; vector<int> edge[N], e[N], ans;
int n, cnt[N], deg[N];
int vis[N];
void dfs(int u ,int pre) {
cnt[u] = ;
for(int v : edge[u]) {
if(v == pre) continue;
dfs(v, u);
cnt[u] += cnt[v];
}
} bool dfs2(int u) {
vis[u] = -;
for(int v : e[u]) {
if(vis[v] == -)
return false;
if(!vis[v] && !dfs2(v))
return false;
}
vis[u] = ;
ans.push_back(u);
return true;
} void dfs3(int u, int pre) {
for(int v : edge[u]) {
if(v == pre) continue;
if(cnt[v] % ) {
e[u].push_back(v);
deg[v]++;
} else {
e[v].push_back(u);
deg[u]++;
}
dfs3(v, u);
}
} int main() {
scanf("%d", &n);
for(int i = ; i <= n; i++) {
int fa; scanf("%d", &fa);
if(fa) {
edge[fa].push_back(i);
edge[i].push_back(fa);
}
}
if(n % == ) {
puts("NO");
return ;
} dfs(, );
dfs3(, ); for(int i = ; i <= n; i++) {
if(vis[i]) continue;
if(!dfs2(i)) {
puts("NO");
return ;
}
}
puts("YES");
for(int i = ans.size() - ; i >= ; i--)
printf("%d\n", ans[i]);
return ;
}
/*
*/
最新文章
- 总结-Hibernate
- 如何启动app时全屏显示Default.png(图片)?
- IOS 支付、性能调试、IPv6兼容支持等
- Spring Collections XML 配置
- Android开发如何去除标题栏title
- Oracle EBS Report 输出字符字段前部"0"被Excel自动去掉问题
- iOS菜鸟之FMDB的二次封装简单易用
- 关于float与double
- sass基础学习
- go语言初体验
- angular学习(六)-- Filter
- 工作中遇到的问题——mysql关于年龄,性别的统计
- SSM-Netty实现软硬件通信,真实项目案例
- 待解决问题 :JDBC indexInsert.addBatch(); 为什么不生效 PSTM
- ELM:ELM实现鸢尾花种类测试集预测识别正确率(better)结果对比—Jason niu
- day10,11练习
- 【libreoffice】libreoffice实现office转pdf、html、jpg等格式数据
- lesson8-图像问答-小象cv
- HTML 内 meta标签
- 【Java】须要配置的三个Java环境变量