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 ...
随机推荐
- 写文件前, 检查目录写权限(PHP)
写文件前, 检查目录写权限 写或保存文件前, 确保目录是可写的, 假如不可写, 输出错误信息. 这会节约你很多调试时间. linux系统中, 需要处理权限, 目录权限不当会导致很多很多的问题, 文件也 ...
- jQuery回车事件
有网就是好. 全局事件: document.onkeydown=function(e){ var ev=document.all?window.evevt:e; if(ev.keyCode==13){ ...
- Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle
Spark Tungsten揭秘 Day2 Tungsten-sort Based Shuffle 今天在对钨丝计划思考的基础上,讲解下基于Tungsten的shuffle. 首先解释下概念,Tung ...
- Python通过Manager方式实现多个无关联进程共享数据
Python官方文档 Python实现多进程间通信的方式有很多种,例如队列,管道等. 但是这些方式只适用于多个进程都是源于同一个父进程的情况. 如果多个进程不是源于同一个父进程,只能用共享内存,信号量 ...
- flash memory
数据删除不是以单个的字节为单位而是以固定的区块为单位(注意:NOR Flash 为字节存储.),区块大小一般为256KB到20MB. 由于其断电时仍能保存数据,闪存通常被用来保存设置信息,如在电脑的B ...
- c语言指针用法
一.指针 int t 定义整型变量 int *p p为指向整型数据的指针变量 int a[n] 定义整型数组a,它有n个元素 int *p[n] 定义指针数组p,它由n个指向整形数据的指针元素组成 i ...
- 在fedora 桌面上添加应用程序
在网上下了个android studio,这个程序只是的压缩包,解压后程序也只能在SHELL下敲入studio.sh才能运行 能不能向其他程序一样,在fedora桌面上找到应用程序,点击执行呢.在网上 ...
- proguardgui.bat来混淆已有的jar包
1.U:\android-sdk\tools\proguard\bin\找到 proguardgui.bat,双击就可以弹出一个混淆的界面 2.加入不要混淆的,比如我们用的系统的,还有别人的jar 3 ...
- 【WS-Federation】到底有多少公司在用WS-Federation
到底有多少公司在用WS-Federation? sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token, ...
- 2016 系统设计第一期 (档案一)MVC ajax 获取json数据
我在做一张表的增删改查的时候,在编辑的时候,需要获取当前选择行对应的Id,然后并且把选择行的Id的对于的数据取出来,代码如下: 列表a标签绑定: Js代码: url: '/Users/GetUserB ...