【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5758

【题目大意】

  给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次数尽量少的情况下至少经过每条路一遍啊,同时最小化走过的路程总长度。输出路程总长度。

【题解】

  首先,对于传送次数尽量少这个条件,我们很容易发现,当且仅当每次出发点和终止点都是叶节点的时候,是最少的,当然在叶节点无法两两匹配的时候,再多走一条链。

  然后就是叶节点的匹配问题,使得匹配后的叶节点连线覆盖全图的路径并且经过的总长度最短,这时候考虑考虑每条边对答案的贡献情况,由于匹配方案不唯一,因此每条边的贡献是利用dp使得耗费最小化的。

  考虑到边每条边最多经过两次,至少经过一次,那么我们枚举这条边两边的情况,在这个点匹配完一些叶节点后还剩下一些链是没有被匹配的时候所能够做到的最小花费。dp[x][i][j]表示,x节点,在当前的遍历情况下,有i个叶节点没有匹配,j条单独链作为最后多走的一条链的最小花费,显然i最多不超过2,j最多不超过1。那么做一个树形DP,将各种情况从子节点转移到根节点即可,由于考虑到图形的特殊性,一开始树的遍历起点不能是叶节点,才能保证每种情况的遍历。

【代码】

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200005;
int T,n,k,s[5][2],x,y,dp[N][5][2];
long long ans;
vector<int> g[N];
void dfs(int x,int pre){
if(g[x].size()==1)dp[x][0][1]=dp[x][1][0]=0;
else dp[x][0][0]=0;
for(int i=0;i<g[x].size();i++){
int p=g[x][i];
if(p==pre)continue;
dfs(p,x);
memset(s,60,sizeof(s));
for(int j=2;j>=0;j--)for(int k=2;k;k--)
for(int U=0;U<=min(j,k);U++){
int t=j+k-2*U;
s[t][0]=min(s[t][0],dp[x][j][0]+dp[p][k][0]+k);
s[t][1]=min(s[t][1],dp[x][j][0]+dp[p][k][1]+k);
s[t][1]=min(s[t][1],dp[x][j][1]+dp[p][k][0]+k);
}memcpy(dp[x],s,sizeof(dp[x]));
}for(int i=2;i;i--)dp[x][i-1][1]=min(dp[x][i-1][1],dp[x][i][0]);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)g[i].clear();
for(int i=1;i<n;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);g[y].push_back(x);
}if(n<=2)printf("%d\n",n-1);
else{
memset(dp,60,sizeof(dp));
for(int i=1;i<=n;i++)if(g[i].size()>1){
dfs(i,-1);
printf("%d\n",min(dp[i][0][0],dp[i][0][1]));
break;
}
}
}return 0;
}

  

HDU 5758 Explorer Bo(树形DP)的更多相关文章

  1. HDU 5758 Explorer Bo

    思维,树形$dp$. 首先选择一个度不为$0$的节点作为根节点,将树无根转有根. 这题的突破口就是要求瞬间移动的次数最少. 次数最少,必然是一个叶子节点走到另一个叶子节点,然后瞬间移动一次,再从一个叶 ...

  2. HDU5758 Explorer Bo 树形dp

    我是参考这一篇写的:http://blog.csdn.net/fsss_7/article/details/52049474 一点感想:dp[i][0]代表以这个点为根的且总叶子数为偶数个叶子的答案 ...

  3. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  4. hdu 5452 Minimum Cut 树形dp

    Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=54 ...

  5. HDU 1520 Anniversary party [树形DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题目大意:给出n个带权点,他们的关系可以构成一棵树,问从中选出若干个不相邻的点可能得到的最大值为 ...

  6. hdu 1520Anniversary party(简单树形dp)

    Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. Install Air Conditioning HDU - 4756(最小生成树+树形dp)

    Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...

  8. HDU 3586 二分答案+树形DP判定

    HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...

  9. HDU 3586.Information Disturbing 树形dp 叶子和根不联通的最小代价

    Information Disturbing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/ ...

随机推荐

  1. IntelliJ IDEA 14 注册码及注册码生成器

    几个license: (1) key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangweivalue:97493-G3A41- ...

  2. 在windows 8.1 64位配置python和opencv

    之前在linux下安装python和opencv及相关的库,都可以直接命令行操作.最近需要在windows下配置一下,查了一些资料,发现网上有很多关于python和opencv的配置,但由于不同版本问 ...

  3. python Memo

    list&tuple 运算 乘以constant >>> x = ((1,2),) >>> x*2 ((1, 2), (1, 2)) >>> ...

  4. 剑指offer——已知二叉树的先序和中序排列,重构二叉树

    这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...

  5. 项目关联不上开源项目(library)

    首先是add library的时候重新打开始始终显示关联错误,在reference中出现一个红叉,无论如何都解决不了,remove后重新添加也会有这个问题,Eclipse也没有任何出错提示. 最后在h ...

  6. 能够免费做商业站点的CMS讨论

    眼下国内使用过PHPCMS   DEDECMS织梦    科讯CMS  帝国.Discuz.Ecshop等,可是他们都是个人非盈利免费,商业.政府.机构授权收费. 使用什么CMS能够免费做商业站点呢? ...

  7. 使用Swift的代理,闭包来封装一个公用协议减少垃圾代码

    iOS开发中,如果不进行适当的封装,使用协议或者继承类来进行开发,你就会遇到传说中的ViewController(以后简称VC) Hell的问题…… 比如说,我们先声网App中为了调用接口,做简单的判 ...

  8. cocos2d-x -- 渠道SDK【棱镜】接入(2)

    上一章<cocos2d-x -- 渠道SDK[棱镜]接入(1)>,已经接入好了SDK.如今要准备加入渠道了,以豌豆荚为例. 详细流程: 1.加入渠道:

  9. VBA 开发学习--基础语法3

    VBA字符串函数列表 Trim(string) 去掉string左右两端空白 Ltrim(string) 去掉string左端空白 Rtrim(string) 去掉string右端空白 Len(str ...

  10. C# 文件帮助类

    using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...