题目链接

问题分析

这题感觉就是有很多种方法,然后一种都写不明白……

首先分为3种情况:

  • 删了根节点下的一个节点,对应两个答案;
  • 删了一个叶节点,对应一个答案;
  • 删了一个其他节点,对应一个答案。

可以从叶子向上一层一层处理。第一个情况比较好判断;剩下两种情况通过对应节点儿子的个数来判断。注意第二种情况叶节点最大深度差只能是1,其他的点不能有深度差(毕竟是完全二叉树)。

面向数据编程

参考程序

#include <bits/stdc++.h>
//#include <unistd.h>
using namespace std; const int Maxn = 131100;
struct edge {
int To, Next;
edge() {}
edge( int _To, int _Next ) : To( _To ), Next( _Next ) {}
};
edge Edge[ Maxn << 1 ];
int Start[ Maxn ], Used;
inline void AddEdge( int x, int y ) {
Edge[ ++Used ] = edge( y, Start[ x ] );
Start[ x ] = Used;
return;
}
int deep, n;
int Deg[ Maxn ], Dep[ Maxn ], Deep, Son[ Maxn ];
int Rec[ Maxn ], Left, Vis[ Maxn ];
int Ans[ 10 ]; int main() {
scanf( "%d", &deep );
n = 1; for( int i = 1; i <= deep; ++i ) n *= 2; n -= 2;
memset( Deg, 0, sizeof( Deg ) );
for( int i = 1; i < n; ++i ) {
int x, y;
scanf( "%d%d", &x, &y );
AddEdge( x, y );
AddEdge( y, x );
++Deg[ x ]; ++Deg[ y ];
} Left = n;
Deep = 1;
for( int i = 1; i <= n; ++i )
if( Deg[ i ] == 1 )
Dep[ i ] = Deep; while( Left > 1 ) {
//printf( "========================================\n" );
//printf( "Deg B:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
//printf( "\n" );
Rec[ 0 ] = 0;
for( int i = 1; i <= n; ++i )
if( Deg[ i ] == 1 ) {
Rec[ ++Rec[ 0 ] ] = i;
if( Son[ i ] != 3 && Dep[ i ] != Deep ) {
printf( "0\n" );
return 0;
}
if( Son[ i ] == 3 && Dep[ i ] + 1 != Deep ) {
printf( "0\n" );
return 0;
}
if( Son[ i ] != 2 && Son[ i ] != 0 ) {
if( Ans[ 0 ] ) {
printf( "0\n" );
return 0;
}
Ans[ ++Ans[ 0 ] ] = i;
}
}
//printf( "Rec %d\n", Rec[ 0 ] );
//for( int i = 1; i <= Rec[ 0 ]; ++i ) printf( "%d ", Rec[ i ] );
//printf( "\n" ); if( Rec[ 0 ] == 2 && Left == 2 ) {
if( Ans[ 0 ] ) {
printf( "0\n" );
return 0;
}
printf( "2\n%d %d\n", Rec[ 1 ], Rec[ 2 ] );
return 0;
} for( int i = 1; i <= Rec[ 0 ]; ++i )
Vis[ Rec[ i ] ] = 1; for( int i = 1; i <= Rec[ 0 ]; ++i ) {
int u = Rec[ i ];
for( int t = Start[ u ]; t; t = Edge[ t ].Next ) {
int v = Edge[ t ].To;
if( Vis[ v ] ) continue;
--Deg[ u ]; --Deg[ v ];
++Son[ v ];
if( Dep[ v ] == 0 ) Dep[ v ] = Deep + 1;
}
} Left -= Rec[ 0 ];
++Deep;
//printf( "Deg A:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
//printf( "\n" );
//printf( "Left = %d\n", Left );
//printf( "Son:\n" );
//for( int i = 1; i <= n; ++i ) printf( "%d ", Son[ i ] );
//printf( "\n" );
//printf( "Ans = %d\n", Ans[ 0 ] );
//sleep( 3 );
} printf( "1\n%d\n", Ans[ 1 ] ); return 0;
}

CF1228F One Node is Gone的更多相关文章

  1. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  2. NPM (node package manager) 入门 - 基础使用

    什么是npm ? npm 是 nodejs 的包管理和分发工具.它可以让 javascript 开发者能够更加轻松的共享代码和共用代码片段,并且通过 npm 管理你分享的代码也很方便快捷和简单. 截至 ...

  3. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  4. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  5. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  6. 高大上的微服务可以很简单,使用node写微服务

    安装 npm install m-service --save 使用 编写服务处理函数 // dir1/file1.js // 使用传入的console参数输出可以自动在日志里带上request id ...

  7. 构建通用的 React 和 Node 应用

    这是一篇非常优秀的 React 教程,这篇文章对 React 组件.React Router 以及 Node 做了很好的梳理.我是 9 月份读的该文章,当时跟着教程做了一遍,收获很大.但是由于时间原因 ...

  8. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  9. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

随机推荐

  1. 牛客 158D a-贝利福斯数

    将所有形如ax+1的数称为a-贝利福斯数,其中x是正整数.一个a-贝利福斯数是a-贝利福斯素数,当且仅当它不能被分解成两个a-贝利福斯数的积.现在给出a,n,问有多少个 ≤ n的a-贝利福斯数可以被分 ...

  2. JS基础_while的练习1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. linux mint ubuntu 安装virtualbox

    安装虚拟机:virtualbox 1.打开终端而且切换到root帐号,然后输入安装命令: apt-get install virtualbox 2.安装推荐的软件包:(必须安装这个包.不然看不到应用程 ...

  4. 高并发之nginx限制

    Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟. 我们会通过一些简单的示例展示Nginx限速限流模块是如 ...

  5. vue 节流

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Fescar锁和隔离级别的理解

    前几天夜里,我老大发我一篇文章说阿里的GTS开源了. 因为一直对分布式事务比较感兴趣,立马pull了代码,进行阅读.基本的原理,实现方案我就不一一细化了,详细见官方文档(写的很棒,点赞). 在fesc ...

  7. 第四篇.python的基础

    目录 第四篇.python基础01 1. 变量 2. 常量 3. python变量内存管理 4. 变量的三个特征 5. 花式赋值 6. 注释 7. 数据类型基础 8. 数字类型 9. 字符串类型 10 ...

  8. Win10应用商店缓存信息多如何去清理?

    Win10系统的应用商店相比之前有了许多的更新,微软也成立了专门的团队准备对应用商店进行完善,但是我们在使用应用商店的过程中会产生许多缓存文件,占用电脑空间资源,也会影响电脑的运行速度. 下面好系统重 ...

  9. SQL语句复习【专题二】

    SQL语句复习[专题二] 单行函数(日期.数学.字符串.通用函数.转换函数)多行函数.分组函数.多行数据计算一个结果.一共5个.sum(),avg(),max(),min(),count()分组函数  ...

  10. RabbitMQ各种交换机类型Exchange Types介绍

    最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...