hdu4714 Tree2cycle 把树剪成链
题目是问把一棵树通过剪边、加边形成一个环的最小代价。
分成两步,先把树剪成一些链,再把链连接成一个环。
设一棵有n个节点的树,剪掉X条边后,形成L条链。
那么代价为X+L。
n-1-X=edgeNum(L条链) ① //原本有n-1条边,剪掉X条,还剩edgeNum(L条链)条
edgeNum(L条链)+L=n ② //L条链的这些边+L条边形成一个有n条边的环
由①、②得到,L=X+1
则代价为 X+L=2*L-1=2*X+1。
问题转化成了,把一棵树剪成一些链,最少能剪成几条链?或者,最少需要剪掉多少条边?
我觉得到了这一步问题就好解决了,我是树形dp搞的,求的是最少能剪成几条链。
dp[u][0]表示u节点是所在链的端点时,以u节点为根节点的子树形成的最少的链数。
dp[u][1]表示u节点是所在链的中间的点时,以u节点为根节点的子树形成的最少的链数。
然后就可以转移了。
#include<cstdio>
#include<cstring>
#include<vector>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N = ;
const int inf = N; vector<int> G[N];
int dp[N][]; inline int min(int a,int b) {return a<b?a:b;} void dfs(int u,int fa)
{
int sz = G[u].size();
int v,cld=,sum=,min1=inf,min2=inf,temp;
for(int i=;i<sz;i++)
{
v = G[u][i];
if( v!=fa )
{
cld++;
dfs(v,u);
temp = min(dp[v][],dp[v][]);
sum += temp;
temp = dp[v][] - temp;
if( temp<min1 ) {min2=min1;min1=temp;}
else if( temp<min2 ) min2=temp;
}
}
if( !cld ) dp[u][]=,dp[u][]=inf;
else if( ==cld ) dp[u][]=sum+min1,dp[u][]=inf;
else
{
dp[u][] = sum + min1;
dp[u][] = sum + min1 + min2 - ;
}
} int main()
{
int T;
int n,u,v; //freopen("4714.in","r",stdin);
//freopen("myout.txt","w",stdout);
scanf("%d",&T);
while( T-- )
{
scanf("%d",&n);
for(int i=;i<=n;i++) G[i].clear();
for(int i=;i<n-;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,);
printf("%d\n",*min(dp[][],dp[][])-);
}
return ;
}
hdu4714 Tree2cycle 把树剪成链的更多相关文章
- 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql
一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- 二元查找树转变成排序的双向链表之C#算法实现
此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...
- Codeforces295A - Greg and Array(线段树的成段更新)
题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...
- P1880 [NOI1995]石子合并 区间dp+拆环成链
思路 :一道经典的区间dp 唯一不同的时候 终点和起点相连 所以要拆环成链 只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...
- 【Data structure & Algorithm】把二元查找树转变成排序的双向链表
把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向. 比如将二元查找树 10 / \ 6 ...
- poj 1179 $Polygon$(断环成链)
Polygon \(solution:\) upd:还是多讲一下,这道题基本上可以说是一道思维题.一道结论题.一道考验你动态规划基本功是否扎实的题目.因为这道题的数据范围很小,思考一下总能想到断环成链 ...
- [hdu4714 Tree2cycle]树形DP
题意:给一棵树,删边和加边的代价都为1,求把树变成一个圈所花的最小代价. 思路:对原树进行删边操作,直到将原树分成若干条链,然后通过在链之间添加边形成圈,由于删边和加边一一对应,且最后需要额外一条边连 ...
- HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)
Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...
随机推荐
- 利用ApnsPHP包向IOS推送消息
header('content-type:text/html;charset=utf-8'); require_once 'ApnsPHP/Autoload.php'; require_once 'A ...
- [Linux]学习笔记(1)
说到Linux就不得不提UNIX,因为Linux是从UNIX系统发展来的,两系统极为相似,可以在UNIX操作系统上使用的功能都可以在Linux上使用,只可能有少许的差异: UNIX系统中所有的东西都是 ...
- setcookie,getcookie,delcookie,setpostBgPic
function setCookie(name,value) { var Days = 365; //此 cookie 将被保存 30 天 var exp = new Date(); //new Da ...
- Spark小课堂Week6 启动日志详解
Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...
- ValueError: No JSON object could be decoded?此种异常的解决方案之一
第一次遇到这样的异常,实在不知道如何是好?进行了测试发现报错的json出没有问题,而且每次出现异常的位置不一样 于是我认为这样的问题可能是因为程序执行过快,所以很简单的解决办法是: def deal_ ...
- 内核升级修复nfs
Not starting NFS kernel daemon: no support in current kernel. sudo gedit /etc/init.d/nfs-kernel-serv ...
- 关于分区技术的索引 index
关于分区技术---索引 Index 一. 分区索引分类: 本地前缀分区索引(local prefixedpartitioned index) 全局分区索引(global partitionedin ...
- VC++入门精通视频教程
1.1.Windows程序运行原理-1 上传日期:2012-03-19 09:18:50 相关摘要: - 在关闭一个windows窗口时,也关闭另一个吗 - 对纯面向对象的PHP程序有何看法? - ...
- eclipse里maven项目An error occurred while filtering resources解决办法(转载)
转自:http://liyanjie918.blog.163.com/blog/static/20227290201581143110105/ 在使用eclipse构建maven项目时,突然出现错误提 ...
- C# - Lambda 表达式
Lambda 表达式分为三个部分: 1 参数定义部分.参数是未类型化的,因此编译器可以根据上下文推断出他们的类型. 2 =>运算符,把Lambda表达式的参数与表达式体分开. 3 表达式体. d ...