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

本来想直接求树的直径,再得出答案,后来发现是错的。

思路:任选一个点进行DFS,对于一棵以点u为根节点的子树来说,如果它的分支数大于1,那么我们把这颗子树从整棵树上剪下来(优先减去),同时把这颗子树的分支留下两个,其它多余的也剪掉,然后把剪下来的这些部分连接到根节点那里,从而形成一条直链,总代价就是我们减的次数+把剪下来的部分连接到根节点+把最后的直链连成环。在这里剪的次数=把剪下来的部分连接到根节点的次数,把最后的直链连成环只需要一步。

参考博客:https://blog.csdn.net/cc_again/article/details/11407157

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<set>
#include<cstdio>
#include<string>
#include<deque>
using namespace std;
typedef long long LL;
#define eps 1e-8
#define INF 0x3f3f3f3f
#define maxn 1000005
int n,m,k,t,cnt;
int ans;
struct node{
int v,next;
}edge[maxn*];
int head[maxn];
void add(int u,int v){
edge[++cnt].v=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
int DFS(int u,int pre){
int num=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==pre)
continue;
num+=DFS(v,u);
}
if(num>){//如果以点u为根节点的子树的分支数大于1
if(u==)
ans+=num-;
else
ans+=num-;
return ;//这颗子树剪断了,所以返回0
}
return ;//分支数只有一个
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int u,v;
cnt=;
memset(head,-,sizeof(head));
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
ans=;
DFS(,-);
printf("%d\n",ans*+);
}
return ;
}

hdu 4714 树+DFS的更多相关文章

  1. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  2. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  3. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  5. hdu 5893 (树链剖分+合并)

    List wants to travel Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/O ...

  6. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  7. hdu 5052 树链剖分

    Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  8. hdu 4897 树链剖分(重轻链)

    Little Devil I Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  9. hdu 5274 树链剖分

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

随机推荐

  1. yii2 自带分页使用

    //下面为控制器层的方法内容use \yii\db\Query;use \yii\data\Pagination; //方法内容        $query=new Query();//from为自带 ...

  2. Java+opencv实现人脸检测

    版本 Java1.8 opencv3.4 代码: import java.awt.Graphics; import java.awt.image.BufferedImage; import javax ...

  3. machine learning data sets

    http://archive.ics.uci.edu/ml/datasets.html 例如 3 分类 鸢尾花 数据集: http://archive.ics.uci.edu/ml/datasets/ ...

  4. JavaScript 快速排序详解

    使用的是<JavaScript数据结构与算法>一书中的快速排序,并加上自己的理解. 经测试,此算法的速度比内置的 sort 更快!而阮一峰的那个快排更像是归并排序,虽然写法简单很多,但是性 ...

  5. SELinux初探

  6. java android 捕获未处理异常

    1. 定义一个异常处理类 public class ExceptionHandler implements Thread.UncaughtExceptionHandler { public Excep ...

  7. PythonStudy——Python中的None与 NULL(即空字符)的区别

    None与 NULL(即空字符)的区别  (1)是不同的一种数据类型 >>>type(None) <class 'NoneType'> >>>type( ...

  8. 巧妇难为无米之炊( Model数据)

    一.相隔万里的客户端服务器数据交互 请求头发过去的轻量级文本数据,后台根据这些信息处理  response返回的如果时html的话,那么是全局刷新 在ajax中data回调获得了数据,然后操作dom进 ...

  9. Keepalived+LVS实现高可用负载均衡双主模式

    LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...

  10. 关于音频总线IIS的学习---Verilog

    关于音频总线IIS的学习---Verilog 主要思想: 在分析寄存器的值变化的时候,将时钟的边沿分两边来看,边沿之前,边沿之后,在always 块语句里面用来分析判断的寄存器的值,都应该用边沿变化之 ...