/*
可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖
dp[u]表示覆盖完u为根的子树需要走的边数,显然在满足传送次数最少的条件下,dp[u]是可以递推的
设以u为根节点,v是u的儿子,如果v就是叶子结点,那么边u->v算一次
如果v中有奇数个叶子节点,那么边u->v只要算一次,因为偶数个叶子结点可以互相配对,然后剩下的叶子结点会从v延伸到u
如果v中有偶数个叶子结点,那么边u->v要算两次
如果叶子结点是偶数,那么dp[1]就是答案,因为任何一颗子树的偶数对叶子结点互相配对,并可以向上延伸

如果叶子结点时奇数,那么某一个叶子结点只要走到岔路口就可以停止了,不用往上走,所以配对时的向上延伸是不必要的
那么找出这么一个叶子结点:其被多算的向上延伸距离是最大的,那么减去被多算的距离就是最优解
那么如果f是那个额外的叶子结点,f向上走到岔路口,从岔路口一直到根,如果u->v被计算了两次,那么因为f是被外挂出来的,所以可以减去一次,
如果u->v只被算了一次,那么要加一次
*/

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
struct Edge{int to,nxt,cnt;}edge[maxn<<];
int n,ans,leaf,head[maxn],tot;
void init(){
memset(head,-,sizeof head);
tot=;
}
void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
}
int dfs(int u,int pre){
int cnt=;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==pre)continue;
edge[i].cnt=dfs(v,u);//访问子树
cnt+=edge[i].cnt;
}
ans+=cnt;
if(cnt==)leaf++;//树叶
if(cnt==||cnt%)return ;
return ;
}
int search(int u,int pre){//返回子树u的最大可以减去的覆盖边数
int mx=;//一定要初始化!其实在岔路口有不往上延伸的选择!、
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(v==pre)continue;
mx=max(mx,search(v,u)+(edge[i].cnt==?:-));
}
return mx;
}
int main(){
int t,u,v;
cin>>t;
while(t--){
init();
cin>>n;
for(int i=;i<n;i++){
cin>>u>>v;
addedge(u,v);
addedge(v,u);
}
if(n<=){
printf("%d\n",n-);
continue;
}
int root=;
while(edge[head[root]].nxt==-)
root++;//找到非叶子节点的根
leaf=ans=;
dfs(root,);
if(leaf%)ans-=search(root,);
printf("%d\n",ans);
}
}

hdu5758 思维,树形dp的更多相关文章

  1. HDU5758 Explorer Bo 思维+树形dp

    题意自己看题目吧,挺短的. 思考过程:昨天感觉一天不做题很对不起自己,于是晚上跑到实验室打开别人树形dp的博客做了上面最后一个HDU的题,也是个多校题..一开始没有头绪了很久,因为起点不固定,所以这1 ...

  2. codeforces 456 D. A Lot of Games(字典数+博弈+思维+树形dp)

    题目链接:http://codeforces.com/contest/456/problem/D 题意:给n个字符串.进行k次游戏.每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为 ...

  3. 洛谷AT2046 Namori(思维,基环树,树形DP)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 树 每次操作把相邻且同色的点反色,直接这样思考会发现状态有很强的后效性,没办法考虑转移. 因为树是二分图,所以我们转化模型:在树的奇数层的所有点上都有一 ...

  4. Codeforces 1088E 树形dp+思维

    比赛的时候看到题意没多想就放弃了.结果最后D也没做出来,还掉分了,所以还是题目做的太少,人太菜. 回到正题: 题意:一棵树,点带权值,然后求k个子连通块,使得k个连通块内所有的点权值相加作为分子除以k ...

  5. CF482D Random Function and Tree 树形DP + 思维 + 神题

    Code: #include<bits/stdc++.h> #define ull unsigned long long #define MOD 1000000007 #define ll ...

  6. 宝藏(树形DP)

      这道题目是十分考验思维的,n^2应该还是比较好想的,主要是如何转移根的问题.转移根,在我看来应该是树形dp最难的一部分了, 一般学会如何转移根,也就差不多考验通吃树形dp了. 下面转一转大佬链接: ...

  7. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  8. POJ 1849 - Two - [DFS][树形DP]

    Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...

  9. [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...

  10. 【Luogu】P3174毛毛虫(树形DP)

    题目链接 树形DP水题,设f[x][0]是以x为根的子树,内部只有半条链(就是链的两个端点一个在子树里,一个不在子树里)的最大值,f[x][1]是以x为根的子树,内部有一条完整的链(选两个内部的子树作 ...

随机推荐

  1. 高性能IO之Reactor模式

    The reactor design pattern is an event handling pattern for handling service requests delivered conc ...

  2. 假设result 是一个float型变量,value是一个int型变量。执行以下赋值语句以后,变量value将是什么类型?为什么?

    假设result 是一个float型变量,value是一个int型变量.执行以下赋值语句以后,变量value将是什么类型?为什么? 在执行这条语句的过程中,保存在vulue变量中的值被读取出来并转化为 ...

  3. SpringCloud知识点20190313

    1.SpringBoot和SpringCloud的关系(面试题) Spring Boot 可以离开 Spring Cloud 单独使用开发项目,但是Spring Cloud离不开SpringBoot, ...

  4. CF1101D GCD Counting

    题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的 ...

  5. requests库入门04-http基本认证

    因为后续样例中GitHub都需要提供认证,所以先写关于基本认证的 http的请求中,有一些请求是需要通过授权认证之后才会响应,授权认证就是检查用户名和密码的过程.http有一个基本认证方式,在认证的过 ...

  6. Python3学习笔记05-数字

    Python 数字数据类型用于存储数值 数字类型不能修改,如果改变数字数据类型的值,将重新分配内存空间 以下实例在变量赋值时 Number 对象将被创建: var1 = 10 var2 = 20 也可 ...

  7. VC显示网页验证码、模拟CSDN网页登录

    摘要:by:koma 这两天,本来想花点时间研究一下QQ空间.农场外挂,于是抓包分析一了下,只可惜,在QQ网页登录时进行了加密处理,可惜我对网页编程一窍不通.有些朋友曾讲过那些是通过JS代码进行加密, ...

  8. [debug]记一次竞态更新bug的解决

    公司的django项目,有一个旧接口,使用POST方法更新用户的一种记录型数据. 这个接口的历史有点长,最早的时候没有那么多需求,只会更新两个布尔字段.后来,加入一个需要高频次记录的字段.这些字段都属 ...

  9. git与eclipse集成之保存快照

    1.1. 保存快照 在个分支进行编码,然后需要紧急切换到另外一个分支进行快速修复一个问题,此时可以先将当前分支的修改进行保存快照. 在分支A进行编码,保存快照 切换到另外分支B进行修改 切换回A分支继 ...

  10. jvm 监控工具

    背景 不懂jvm监控工具好意思说自己搞java的吗.其实搞了十多年的人我都见过不懂得,不懂不要紧,老实工作就行啊.这就是属于非技术的话题了,实在不知从何说起.还是赶紧学习下吧,可以去装了.我认真学习后 ...