【题目链接】 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. leetcode Merge K sorted Lists python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

  2. javascript中的for……in循环

    <script type="text/javascript">    var theBeatles=new Array("John","P ...

  3. Sencha Touch 之 Ext.fly方法的使用

    Ext.fly方法是Ext.js 4中的flyweight技术,该技术在浏览器中为使用Ext.fly方法的元素节点开辟一块内存,下一次使用Ext.fly方法的元素节点将占据同一块内存,即覆盖前一次的元 ...

  4. 帝国cms <!--list.var1-->产生不同样式

    制作帝国列表模板正常情况下 列表内容模板(list.var) (*) 写 <li class=''>[!--title--]<a href='[!--titleurl--]'> ...

  5. WIX 学习笔记 - 2 第一个WIX 项目 HelloWIX

    程序员们都非常熟悉 Hello World!,基本上所有的语言书都以打印一个 Hello World! 作为第一个代码示例. 我们也要发扬代码界的优良传统,使用 Hello WIX! 作为我们的入门示 ...

  6. Unix/Linux环境C编程入门教程(15) BT5开发环境搭建

    1. Backtrack 是处于世界领先地位的渗透测试和信息安全审计发行版本.有着上百种预先安装好的工具软件,并确定能完美运行,Backtrack5 提供了一个强大的渗透测试平台--从Web hack ...

  7. Codeforces 263E

    Codeforces 263E 原题 题目描述:一个\(n \times m\)的矩阵,每格有一个数,给出一个整数\(k\),定义函数\(f(x, y)\): \[f(x, y)=\sum_{i=1} ...

  8. sublime text 插件开发

    前言:术语和参考资料 sublime text 2的扩展模式相当的丰富.有多种方法可以修改语法高亮模式以及所有的菜单等.它还可以创建一个新的build系统,自动补全,语言定义,代码片段,宏定义,快捷键 ...

  9. mongodb查询关于大于小于的用法;

    mongoDB查询操作符: http://www.runoob.com/mongodb/mongodb-operators.html 项目中需要的场景是这样的,每个人每天只能领取一张明信片,换句话说, ...

  10. 总结:C#变量,占位符等相关知识

    新年耽误了不少时间,好久没认真的坐下来学习了,新年也快完了,又要开始正式学习了,按着视频教学学习,用了一天的时间,学习了下简单的变量及其相关的输入输出和应用,学了几种最基本的类型: int(整型) c ...