博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 964D 思维,dfs
阅读量:4672 次
发布时间:2019-06-09

本文共 1445 字,大约阅读时间需要 4 分钟。

题意:

一棵树,每次可选择一个度为偶数的点删掉,并且这个点连的边也删掉,问最后能否把所有点删掉。
tags:
注意到一个点:要把一棵树全部删掉,那它的点数一定是奇数。因为每次是删掉偶数条边,只有所有的边数是偶数时才能全部删掉。
所以在 dfs 的时候,如果一个子树的 Size 是偶数,那就要先删掉这棵子树才能删 root 点。

// 964D#include
using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")#define rep(i,a,b) for (int i=a; i<=b; ++i)#define per(i,b,a) for (int i=b; i>=a; --i)#define mes(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define MP make_pair#define PB push_back#define fi first#define se secondtypedef long long ll;const int N = 200005;int n, deg[N], sz[N];vector< int > G[N];void dfs_sz(int u, int fa) { ++sz[u]; for(int to : G[u]) if(to!=fa) { dfs_sz(to, u); sz[u] += sz[to]; }}vector< int > ans;bool dfs(int u, int fa) { for(int to : G[u]) if(to!=fa && !(sz[to]&1)) { if(!dfs(to, u)) return false; --deg[u]; } if(deg[u]&1) return false; ans.PB(u); for(int to : G[u]) if(to!=fa && (sz[to]&1)) { --deg[to]; if(!dfs(to, u)) return false; } return true;}int main(){ scanf("%d", &n); int pi; rep(i,1,n) { scanf("%d", &pi); if(pi!=0) { G[i].PB(pi), G[pi].PB(i); ++deg[i], ++deg[pi]; } } dfs_sz(1, -1); if(dfs(1,-1)) { puts("YES"); for(int v : ans) printf("%d\n", v); } else puts("NO"); return 0;}

转载于:https://www.cnblogs.com/sbfhy/p/8884918.html

你可能感兴趣的文章
轻松学SQL Server数据库pdf
查看>>
Oracle 日期查询
查看>>
说说今年的计划
查看>>
把discuzX 的用户登录信息添加到纯静态页面
查看>>
文件大小计算
查看>>
iOS:给图片置灰色
查看>>
Java 8 (5) Stream 流 - 收集数据
查看>>
ubuntu下安装JDK
查看>>
【C#】使用DWM实现无边框窗体阴影或全透窗体
查看>>
【MySql】脚本备份数据库
查看>>
keil5 配置 stm32f103rc 软件仿真
查看>>
RESTful到底是什么玩意??
查看>>
Oracle创建视图的一个问题
查看>>
(一)线性表
查看>>
hdu 1003 Max Sum (DP)
查看>>
mysql增备
查看>>
[APIO2015]雅加达的摩天楼
查看>>
andorid之帧布局FrameLayout
查看>>
(转,记录用)jQuery页面加载初始化的3种方法
查看>>
C++常量的引用 const
查看>>