假设最少删除的边的个数为cost,显然,最终答案即为cost+cost+1 (因为删除一条边,就会增加一个链,所以删除cost条边后,就会有cost+1条链,将这cost+1条链连接起来的代价为cost+1, 删除cost条边的代价为cost,所以总代价为cost+cost+1)

求最少删除的边数:

首先我们定义一棵子树中的链不能以该子树的根为端点,以下提到的所有链均必须满足这个条件。

设一棵以节点i为根的子树中,叶子节点的个数为duan,并设i的父亲为fa。

那么,这棵子树至少会分割成duan-1条链(以其中两个叶子为端形成一条链,剩下的一个叶子对应一条链)。

DFS,对于某棵以节点i为根的子树,如果子树中叶子节点个数<=1,那么在这棵子树内无法分割成完整的一条链(分割成完整的链至少需要两个叶子),相当于对fa而言,节点i依然是一个叶子。

如果子树中有>=2个叶子,那么这棵子树内可以分割成完整的duan-1条链,相当于对fa而言,删掉节点i及以i为根的子树。

PS1.对于没有fa的节点特殊判断一下。

PS2.手动扩栈

#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector> using namespace std; const int MAXN = ; struct node
{
int v;
int next;
}; int n;
node D[MAXN<<];
int head[MAXN];
int cost, EdgeN; void AddEdge( int u, int v )
{
D[EdgeN].v = v;
D[EdgeN].next = head[u];
head[u] = EdgeN++;
return;
} int DFS( int cur, int fa )
{
int duan = ;
for ( int i = head[cur]; i != -; i = D[i].next )
{
if ( D[i].v != fa )
duan += DFS( D[i].v, cur );
}
if ( duan < ) return ;
else
{
if ( cur == ) cost += duan - ; //如果是根节点
else cost += duan - ;
return ;
}
} int main()
{
int T;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%d", &n );
memset( head, -, sizeof(int)*(n+) );
EdgeN = ;
for ( int i = ; i < n; ++i )
{
int u, v;
scanf( "%d%d", &u, &v );
AddEdge( u, v );
AddEdge( v, u );
} cost = ;
DFS( , - );
int ans = cost + + cost;
printf("%d\n", ans );
}
return ;
}

最新文章

  1. NSMutableAttributedString常用代码
  2. zepto源码--核心方法6(显示隐藏)--学习笔记
  3. 使用maven来管理您的java项目
  4. C2第六次作业解题报告
  5. Python连接MySQL数据库
  6. kafka集群和zookeeper集群的部署,kafka的java代码示例
  7. 获取任意可序列化对象的Xml字符串,方便在日志中查看任一所感兴趣的对象。
  8. 2.cadence制板流程[原创]
  9. C#程序打包安装部署
  10. bat实现往hosts文件追加内容
  11. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
  12. 性能测试day06_需求设计的学习(性能重中之重,思维方向永远重于工具)
  13. DOS文件转换成UNIX文件格式详解
  14. document.write中输出html标签用法
  15. 【密码学】轻松理解“加盐”的原理与java实现
  16. Python如何利用Xpath进行解析
  17. java执行shell脚本并输出执行情况
  18. SQL记录-PLSQL集合
  19. Aborted connection 1055898 to db: &#39;xxx&#39; user: &#39;yyy&#39; host: &#39;xxx.xxx.xxx.xxx&#39; (Got timeout reading communication packets)
  20. php 从1加到100

热门文章

  1. python打印对象所有属性
  2. Git log、diff、config 进阶
  3. Javascript与C#中使用正则表达式
  4. 3、SpringBoot------邮件发送(1)
  5. MySql编码、卸载、启动问题
  6. 【Python 2 到 3 系列】 关于除法的余数
  7. Linux下MySQL安装及配置
  8. POJ 3171 区间最小花费覆盖 (DP+线段树
  9. BZOJ 1441: Min(裴蜀定理)
  10. Postgres常用命令之增、删、改、查