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