Destruction of a Tree (dfs+思维)

三维重建(十八)——colmap的使用(粗浅) 阅读详情

Destruction of a Tree

You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges).

A vertex can be destroyed if this vertex has even degree. If you destroy a vertex, all edges connected to it are also deleted.

Destroy all vertices in the given tree or determine that it is impossible.


Input

The first line contains integer n (1 ≤ n ≤ 2·105) — number of vertices in a tree.

The second line contains n integers p1, p2, ..., pn (0 ≤ pi ≤ n). If pi ≠ 0 there is an edge between vertices i and pi. It is guaranteed that the given graph is a tree.

Output

If it's possible to destroy all vertices, print "YES" (without quotes), otherwise print "NO" (without quotes).

If it's possible to destroy all vertices, in the next n lines print the indices of the vertices in order you destroy them. If there are multiple correct answers, print any.

Examples
Input
5
0 1 2 1 2
Output
YES
1
2
3
5
4
Input
4
0 1 2 3
Output
NO
Note

In the first example at first you have to remove the vertex with index 1 (after that, the edges (1, 2) and (1, 4) are removed), then the vertex with index 2 (and edges (2, 3) and (2, 5) are removed). After that there are no edges in the tree, so you can remove remaining vertices in any order.


题意:让我们每次删除度数为偶数的节点,问最后能否把所有的点删除,如果能全部删除,输出YES并且输出每个节点删除顺序,否则输出NO

思路:这道题乍一看比较容易想出大体的框架,可以用dfs可以用bfs,先找出偶数度的点,开始删除,但是就会发现一个问题,如果我们删除掉一下偶数度的点后,由于边数的减少可能会使得某些其他点原来是偶数度,结果一删其他点它变成了奇数度,就再也变不回去了,导致原本可以完全删除的情况变得不可完全删除,由此我们可以贪心消除靠近叶子节点的偶数点,自下而上进行检查删除,这样他对于其他点的影响可以降到最小

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
using namespace std;
const int maxn = 2e5+10;
int n,pre[maxn],vis[maxn],degree[maxn];
vector<int> G[maxn];
vector<int> ans;
stack<int> st;
void dfs1(int p,int x){
    st.push(x);
    pre[x] = p;
    for(int i = 0; i < G[x].size(); i++){
        int y = G[x][i];
        if(y == p) continue;//直往下存儿子
        dfs1(x,y);
    }
}
void dfs2(int x){
    ans.push_back(x);
    vis[x] = 1;
    for(int i = 0; i < G[x].size(); i++){
        int y = G[x][i];
        degree[y]--;
        if(y == pre[x]) continue;//父亲节点不用管了,因为这个点一定是从父亲节点过来的
        if(vis[y]) continue;//删过的点不用管了
        if(degree[y] % 2 == 0) dfs2(y);
    }
}
int main(){
    memset(vis,0,sizeof(vis));
    memset(degree,0,sizeof(degree));
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        int x;
        scanf("%d",&x);
        if(x){
            G[i].push_back(x);
            G[x].push_back(i);
            degree[i]++;
            degree[x]++;
        }
    }
    dfs1(0,1);//深搜将节点用栈储存,这样顶部是叶子节点
    while(!st.empty()){
        int x = st.top();
        st.pop();
        if(degree[x] % 2 == 0)
            dfs2(x);
    }
    if(ans.size() == n){
        printf("YES\n");
        for(int i = 0; i < ans.size(); i++){
            printf("%d\n",ans[i]);
        }
    }
    else{
        printf("NO\n");
    }
    return 0;
}

鸿蒙接入微信支付 微信H5网页在鸿蒙系统的适配方法(含支付兼容方案) 微信H5适配鸿蒙系统 | ArkWeb识别 | 鸿蒙浏览器UA | 微信支付鸿蒙适配 | 鸿蒙微信判断方式 微信H5网页鸿蒙系统适配指南 针对微信H5网页在鸿蒙系统出现的兼容问题,本文提供完整适配方案。关键点包括: 环境识别: 阅读详情

相关推荐

vba 修改下拉列表_Excel联想式下拉菜单制作教程II

?点击关注Excel表哥公众号上期我们分享了Excel联想式下拉菜单制作教程,可以简化大家在下拉菜单过长时的数据录入工作。文章末尾给大家提出了一个问题:为什么下拉列表数据源需要先排序?今天我们继续分享一个不用对数据源排序也能实现的下拉列表制作方法。先看最终的效果动图:今日分享难度指数:★★★★☆01创建辅助列在需要设置下拉列表的工作表中创建一列辅助列,如下图所示:在辅助列F3单元格输入下...

weixin_39593718的博客 1576

D. Destruction of a Tree

D. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a tree (a graph withnvertices andn - 1e...

black_horse2018的博客 208

电子发票二维码背后的秘密:10分钟看懂校验码、加密字符含义与防伪设计

本文深入解析电子发票二维码的结构与防伪设计,揭示校验码和加密字符的生成原理及验证方法。通过实际案例和技术细节,帮助财务人员理解电子发票的安全机制,提升防伪识别能力,确保税务合规。

weixin_29248611的博客 528

几道有关图的练习题

1.Maximum Indegree   Time Limit: 1000MS   Memory Limit: 10000K   Given a directed graph with N vertices (1 ≤ N≤ 2,500) and C (1 ≤ C ≤ 10,000)  edges, each vertex of

cs_dota的专栏 1269

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1240

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

WW、forever的博客 2155

Codeforces Round #475 (Div. 1) B. Destruction of a Tree

题目:http://codeforces.com/contest/963/problem/BB. Destruction of a Treetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a tree (a graph...

oWuHen12的博客 347

LeRobot 入门教程(五)异步推理

本文介绍了基于SmolVLA的异步推理技术在机器人控制中的应用。通过将动作预测与执行解耦,异步推理消除了传统同步推理中的等待延迟,使机器人行为更加流畅。文章详细讲解了如何安装依赖、启动策略服务器和机器人客户端,并重点说明了关键参数actions_per_chunk和chunk_size_threshold的调整方法。实验表明,异步推理能显著提升机器人响应速度,特别适合大规模模型应用。最后,文章建议用户根据具体硬件和任务需求优化参数配置,以获得最佳性能。

2506_90492529的博客 1642

CodeForces - 963B Destruction of a Tree (思维题)

Destruction of a Treetime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a tree (a graph with n vertices and n - 1 edges in which it's po...

LP_Cong 719

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

SAP_FICO模块-资产减值功能对折旧和残值的影响

SAP_FICO模块-资产减值操作对资产历史折旧以及后续折旧的影响,包括减值操作的配置前提

风沙的博客 2802

Destruction of a Tree CodeForces - 964D

题面题意给出一棵树,你可以摧毁其中度数为偶数的点,同时与之相连的点将被一起摧毁,问能否摧毁所有点,若能,还要输出方案.做法首先可以发现点数为偶数的肯定不行,因为每次删除偶数条边,因此对于一对父子,若子节点的字子树大小为奇数,则肯定先摧毁其父节点再摧毁它,反之先摧毁其父节点再摧毁它,我们可以据此得出父子间的先后关系,再进行拓扑排序即可得出答案.代码#include<iostream> #include

yzyyylx的博客 814

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Codeforces 964D - Destruction of a Tree(思维 + DFS)

关键点:自底向上检查度数时若发现某一节点为偶数,同时可以destory此节点的子树。因为当前节点删去后,子节点度数-1可删去,孙子节点同理。#include &lt;bits/stdc++.h&gt; using namespace std; const int maxn = 200005; struct Edge { int to, next; }e[maxn*2]; int hea...

%%% 297

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Codeforces 963B Destruction of a Tree 思维+dfs

题目大意: 给出一棵树,每次只能摧毁有偶数个度的节点,摧毁该节点后所有该节点连着的边都摧毁,判断一棵树能否被摧毁,若能,按顺序输出摧毁的点,如果有多种顺序,输出一种即可 基本思路: 1)我一开始自然而然想到的,当然是贪心,首先判断能否可行,然后我是想先从叶子到根摧毁一编,然后从根开始再摧毁,我觉得应该可行,还没试验; 2)rank前10的代码,我就不不自量力的去评价了,自己体会吧。 代码...

weixin_30695195的博客 113

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

D. Destruction of a Tree_dfs序_性质分析_思维题

D. Destruction of a Tree_dfs序_性质分析_思维题 题意: 给定一棵树,每次可以拆掉一个树上度数为偶数的点,拆掉该点后,与该点所连的所有边都会被删掉。问,是否有一种删点顺序可以删掉所有的点。如果有,则输出任意一组解。 数据范围:线性做法 O(n) 不妨从叶子节点开始考虑问题。...

EM LGH 183

CodeForces - 963B Destruction of a Tree (dfs+思维题)

  B. Destruction of a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a tree (a graph with n vertices and...

蔡军帅 289

Codeforces 963B Destruction of a Tree(dfs)

题目链接:Destruction of a Tree 题意 给定一个 nnn 个节点的树,每次可以从树上选择一个度为偶数的节点进行删除,每删除一个节点,与这个节点相连的所有边都被删除,问能否删除整棵树。 输入 第一行为一个整数 n&nbsp;(1≤n≤2×105)n&nbsp;(1≤n≤2×105)n~(1\leq n\leq2\times10^5),第二行为 nnn 个...

Dmaxiya 395

cf963b Destruction of a Tree

越靠近叶子越优先删掉 #include <iostream> #include <vector> #include <cstdio> using namespace std; int n, uu, hea[200005], cnt, deg[200005], fa[200005]; bool vis[200005]; vector<int>...

dianjiaxian1205的博客 144

codeforce 964D Destruction of a Tree[dfs]

题目大意:给你一棵树,每次只能删除度为2的结点,问你能否将整棵树删除,如果可以的话,就输出路径 题目分析,对于一棵树的某一个结点的子树来说,如果他的所有结点的度都是奇数,而该结点的度是偶数的话,那么其一定为一个能够先删除的结点,因为如果不先删除该结点,而先删除该结点的父结点,那么这个结点的度就会变为奇数,就不能被删除了 所以只要用dfs进行递归,找到需要的结点,再用dfs找路径即可 #inc...

beckyUp的博客 308

CF963B Destruction of a Tree

题目大意 给你一棵树,如果树上的节点有偶数条边与它相连,则这个节点是可删除的,删除这个节点后所有与之相连的边也将删除。 判断一棵树是否可以依次删除所有节点。 可以删除输出 YES,并输出依次删除的点的编号; 不可以则输出 NO。 解题思路 显然,叶子节点度数为 111,必须要先删除父亲节点,如果父亲节点是偶数那直接删,但是如果是奇数还得继续往上找。 也就是说,我们可以先从下往上搜一遍树,看到度数为偶数的点直接删除,加入答案。 剩下的再从上到下扫一遍,如果有奇数度节点,那么肯定他的儿子与父亲都不是偶数度节点,

orz 489

CF 964D Destruction Of A Tree 思维,set

题意:n个节点的树,操作:删除度数为偶数的顶点以及他所有的边. n 每次删除偶数度的顶点,也就是每次删除某个点其偶数个边. 若顶点数为偶数,那么有奇数条边 永远会有一条边不会被删除,此时肯定无解. 若顶点数为奇数,那么至少有一个点的度为偶数 (因为总的度数为偶数),此时一定有解. 要想删叶子节点 就必须删掉其父节点. 顺着叶子往上找到第一个度数为偶数的点u,此时u的

noone0的博客 224

Codeforces Round #475 (Div. 2) D. Destruction of a Tree

1 You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges). 2 3 A vertex can be destroyed if ...

DDDDDDDDDD4444444444的博客 220

Destruction of a Tree (贪心)

You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges).A vertex can be destroyed if this vertex has even d...

码农的一亩三分地 291

963B:Destruction of a Tree

You are given a tree (a graph with n vertices and n - 1 edges in which it's possible to reach any vertex from any other vertex using only its edges). A vertex can be destroyed if this vertex has ev...

weixin_30600197的博客 228

codeforces 963B Destruction of a Tree

http://www.elijahqi.win/archives/3449 题目描述 You are given a tree (a graph with n vertices and n−1 edges in which it’s possible to reach any vertex from any other vertex using only its edges). A ver...

Elijahqi 307
上一篇: Eight II HDU - 3567 (bfs打表+hash映射+康托展开)
下一篇: Doing Homework hdu1074(状压dp)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值