题目链接

问题分析

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

首先分为3种情况:

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

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

面向数据编程

参考程序

  1. #include <bits/stdc++.h>
  2. //#include <unistd.h>
  3. using namespace std;
  4. const int Maxn = 131100;
  5. struct edge {
  6. int To, Next;
  7. edge() {}
  8. edge( int _To, int _Next ) : To( _To ), Next( _Next ) {}
  9. };
  10. edge Edge[ Maxn << 1 ];
  11. int Start[ Maxn ], Used;
  12. inline void AddEdge( int x, int y ) {
  13. Edge[ ++Used ] = edge( y, Start[ x ] );
  14. Start[ x ] = Used;
  15. return;
  16. }
  17. int deep, n;
  18. int Deg[ Maxn ], Dep[ Maxn ], Deep, Son[ Maxn ];
  19. int Rec[ Maxn ], Left, Vis[ Maxn ];
  20. int Ans[ 10 ];
  21. int main() {
  22. scanf( "%d", &deep );
  23. n = 1; for( int i = 1; i <= deep; ++i ) n *= 2; n -= 2;
  24. memset( Deg, 0, sizeof( Deg ) );
  25. for( int i = 1; i < n; ++i ) {
  26. int x, y;
  27. scanf( "%d%d", &x, &y );
  28. AddEdge( x, y );
  29. AddEdge( y, x );
  30. ++Deg[ x ]; ++Deg[ y ];
  31. }
  32. Left = n;
  33. Deep = 1;
  34. for( int i = 1; i <= n; ++i )
  35. if( Deg[ i ] == 1 )
  36. Dep[ i ] = Deep;
  37. while( Left > 1 ) {
  38. //printf( "========================================\n" );
  39. //printf( "Deg B:\n" );
  40. //for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
  41. //printf( "\n" );
  42. Rec[ 0 ] = 0;
  43. for( int i = 1; i <= n; ++i )
  44. if( Deg[ i ] == 1 ) {
  45. Rec[ ++Rec[ 0 ] ] = i;
  46. if( Son[ i ] != 3 && Dep[ i ] != Deep ) {
  47. printf( "0\n" );
  48. return 0;
  49. }
  50. if( Son[ i ] == 3 && Dep[ i ] + 1 != Deep ) {
  51. printf( "0\n" );
  52. return 0;
  53. }
  54. if( Son[ i ] != 2 && Son[ i ] != 0 ) {
  55. if( Ans[ 0 ] ) {
  56. printf( "0\n" );
  57. return 0;
  58. }
  59. Ans[ ++Ans[ 0 ] ] = i;
  60. }
  61. }
  62. //printf( "Rec %d\n", Rec[ 0 ] );
  63. //for( int i = 1; i <= Rec[ 0 ]; ++i ) printf( "%d ", Rec[ i ] );
  64. //printf( "\n" );
  65. if( Rec[ 0 ] == 2 && Left == 2 ) {
  66. if( Ans[ 0 ] ) {
  67. printf( "0\n" );
  68. return 0;
  69. }
  70. printf( "2\n%d %d\n", Rec[ 1 ], Rec[ 2 ] );
  71. return 0;
  72. }
  73. for( int i = 1; i <= Rec[ 0 ]; ++i )
  74. Vis[ Rec[ i ] ] = 1;
  75. for( int i = 1; i <= Rec[ 0 ]; ++i ) {
  76. int u = Rec[ i ];
  77. for( int t = Start[ u ]; t; t = Edge[ t ].Next ) {
  78. int v = Edge[ t ].To;
  79. if( Vis[ v ] ) continue;
  80. --Deg[ u ]; --Deg[ v ];
  81. ++Son[ v ];
  82. if( Dep[ v ] == 0 ) Dep[ v ] = Deep + 1;
  83. }
  84. }
  85. Left -= Rec[ 0 ];
  86. ++Deep;
  87. //printf( "Deg A:\n" );
  88. //for( int i = 1; i <= n; ++i ) printf( "%d ", Deg[ i ] );
  89. //printf( "\n" );
  90. //printf( "Left = %d\n", Left );
  91. //printf( "Son:\n" );
  92. //for( int i = 1; i <= n; ++i ) printf( "%d ", Son[ i ] );
  93. //printf( "\n" );
  94. //printf( "Ans = %d\n", Ans[ 0 ] );
  95. //sleep( 3 );
  96. }
  97. printf( "1\n%d\n", Ans[ 1 ] );
  98. return 0;
  99. }

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. lombok 注解

    lombok 注解 1. 什么是 lombok 注解 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现 ...

  2. WAV格式文件无损合并&帧头数据体解析(python)(原创)

    一,百度百科 WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频 ...

  3. c# 多线程使用队列顺序写日志的类 (需要再优化)

    using System; using System.Collections.Generic; using System.Threading; public class LogManager { // ...

  4. Mockito中的@Mock和@Spy如何使用

    相同点 spy和mock生成的对象不受spring管理 不同点 1.默认行为不同 对于未指定mock的方法,spy默认会调用真实的方法,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默 ...

  5. #!/usr/bin/node 是什么意思

    // 调用系统环境变量中的解释器执行文件 #!/usr/bin/node //如果不是默认安装位置这个地方可能就找不到,那么文件就是报错,所以有了另一种写法 #!/usr/bin/env node

  6. java 中 get post

    package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  7. flutter: Another exception was thrown: Navigator operation requested with a context that does not include a Navigator.

    import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends State ...

  8. RAD Studio 10.3.2七大新功能介绍

    RAD Studio 10.3.2七大新功能 Delphi支持macOS 64位应用的开发. C++Builder中Windows 64位平台支持C ++ 17特性. C ++ LSP 代码洞察改进. ...

  9. 【1】Zookeeper概述

    一.前言 在"网络是不可靠的"这一前提下,分布式系统开发需要解决如下四个问题: 客户端如何访问众多服务?  解决方案:服务聚合,使用API网关 服务于服务之间如何通信?  解决方案 ...

  10. Visual Studio 添加 自定义 路径宏

    在编辑VS工程包含路径和库路径时,有时需要添加第三方包的路径,比如c++ boost库, 为了协作的方便,不合适直接把本地绝对路径添加入工程设置,此时可以添加自定义路径宏, 然后参与协作的每个开发人员 ...