题目是问把一棵树通过剪边、加边形成一个环的最小代价。

分成两步,先把树剪成一些链,再把链连接成一个环。

设一棵有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 把树剪成链的更多相关文章

  1. 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql

    一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...

  2. MS - 1 - 把二元查找树转变成排序的双向链表

    ## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10       ...

  3. 二元查找树转变成排序的双向链表之C#算法实现

    此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...

  4. Codeforces295A - Greg and Array(线段树的成段更新)

    题目大意 给定一个序列a[1],a[2]--a[n] 接下来给出m种操作,每种操作是以下形式的: l r d 表示把区间[l,r]内的每一个数都加上一个值d 之后有k个操作,每个操作是以下形式的: x ...

  5. P1880 [NOI1995]石子合并 区间dp+拆环成链

    思路 :一道经典的区间dp  唯一不同的时候 终点和起点相连  所以要拆环成链  只需要把1-n的数组在n+1-2*n复制一遍就行了 #include<bits/stdc++.h> usi ...

  6. 【Data structure & Algorithm】把二元查找树转变成排序的双向链表

    把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向. 比如将二元查找树 10 /       \ 6       ...

  7. poj 1179 $Polygon$(断环成链)

    Polygon \(solution:\) upd:还是多讲一下,这道题基本上可以说是一道思维题.一道结论题.一道考验你动态规划基本功是否扎实的题目.因为这道题的数据范围很小,思考一下总能想到断环成链 ...

  8. [hdu4714 Tree2cycle]树形DP

    题意:给一棵树,删边和加边的代价都为1,求把树变成一个圈所花的最小代价. 思路:对原树进行删边操作,直到将原树分成若干条链,然后通过在链之间添加边形成圈,由于删边和加边一一对应,且最后需要额外一条边连 ...

  9. 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 ...

随机推荐

  1. CentOS平台下为Python添加MongoDB支持PyMongo

    下载PyMongo [root@leezhen ~]# wget https://pypi.python.org/packages/source/p/pymongo/pymongo-2.6.3.tar ...

  2. zencart后台增加菜单选项

    如果要在程序中使用额外的参数,在后台控制,添加到菜单属性 在后台 SQL脚本 运行如下 SQL语句 INSERT INTO configuration (configuration_title, co ...

  3. discuz x3插件开发傻瓜图文教程,用demo说话

    此demo功能是在模板footer部位插入一段javascript代码,这段代码可以是alert提示,也可以是加载广告等等. 第一步: 在config\config_global.php 文件里设置$ ...

  4. Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll

    Ever read a really long blog post or article and then had to scroll all the way up to the top of the ...

  5. Linux 查看某个用户的进程

    Linux 查看某个用户的进程 To view only the processes owned by a specific user, use the following command: top ...

  6. ASP.NET MVC 开发中遇到的两个小问题

    最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了两个小问题,通过查找相关渠道解决了,在这里把这两个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助 ...

  7. UVA 524

    Description   A ring is composed of n (even number) circles as shown in diagram. Put natural numbers ...

  8. raise_application_error用法

    我们经常通过dbms_output.put_line来输出异常信息,但有时需要把异常信息返回给调用的客户端.此时我们用raise_application_error,允许用户在pl/sql中返回用户自 ...

  9. centos修改ssh端口

    1.编辑防火墙配置:vi /etc/sysconfig/iptables防火墙增加新端口2222-A INPUT -m state --state NEW -m tcp -p tcp --dport ...

  10. Lua基础之coroutine(协程)

    概括:1.创建协程2.coroutine的函数3.coroutine的基本流程4.yield对coroutine流程的干预5.resume, function()以及yield之间的参数传递和返回值传 ...