题目描述

有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1。现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点。

输入输出格式

输入格式:

第一行。一个数n,表示有n个村民。

接下来n-1行,每行两个数字a和b,表示村民a的家和村民b的家之间存在一条路径。

输出格式:

一行输出两个数字x和y

x表示村长将会在哪个村民家中举办会议

y表示距离之和的最小值

输入输出样例

输入样例#1: 复制

4
1 2
2 3
3 4
输出样例#1: 复制

2 4

说明

【数据范围】

70%数据n<=1000

100%数据n<=50000


又是一道树形dp,我最近树形dp是不是写的太多了QAQ

用up and down 做两次dfs,第一次求出每一个点的子树大小size[]和它子树上的每一个点到这个点的距离之和ste[]。

作完第一步以后,可以发现这时每个点到根节点的距离之和已经处理完了。用这一性质从上到下更新每一个非根节点,可以算出到k节点开会的总步数stp[k]=stp[father[k]]+size[1]-2*size[k]


#include<iostream>
#include<stdio.h> using namespace std; int i,m,n,g,h,k,a[1000001],head[1000001],ver[10000001],nex[1000001],cnt,size[100001],ste[1000001],ans=0x7ffffff,p,deep[1000001],stp[1000001]; void add(int x,int y)
{
cnt+=1;
ver[cnt]=y;
nex[cnt]=head[x];
head[x]=cnt;
} void dfs1(int x,int f)
{
size[x]=1;
for(int i=head[x];i;i=nex[i])
{
int t=ver[i];
if(t==f) continue;
deep[t]=deep[x]+1;
dfs1(t,x);
ste[x]+=ste[t]+size[t];
size[x]+=size[t];
}
} void dfs2(int x,int f)
{
for(int i=head[x];i;i=nex[i])
{
int t=ver[i];
if(t==f) continue;
stp[t]=stp[x]+size[1]-2*size[t];
if(stp[t]==ans) p=min(p,t);
if(stp[t]<ans) ans=stp[t],p=t;
dfs2(t,x);
}
} int main()
{
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d%d",&g,&h);
add(g,h);
add(h,g);
}
dfs1(1,0);
stp[1]=ans=ste[1]; p=1;
dfs2(1,0);
printf("%d %d",p,ans);
}

  

P1395 会议的更多相关文章

  1. P1395 会议(求树的重心)

    P1395 会议 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么 ...

  2. 洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)

    To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会 ...

  3. luogu P1395 会议

    题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地 ...

  4. 洛谷P1395 会议 题解

    $题目$ 为什么这个题会有图论的标签啊,虽然图论也包括找树的重心,可是这很容易让人联想到最短路,但不得不说,这是一个典型的找树的重心模板题. 树的重心是什么? 找到一个点,其所有的子树中最大的子树节点 ...

  5. 洛谷P1395 会议 (树的重心)

    这道题考察了树的重心的性质,所有点到中心的距离之和是最小的,所以我们一遍dfs求出树的重心,在跑一次dfs统计距离之和. 1 #include<bits/stdc++.h> 2 using ...

  6. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  7. P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  8. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  9. Syscan360会议胸牌破解揭秘

    Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...

随机推荐

  1. js post跳转

    function clickFunc(id) { var params = new Array(); params.push({ name: "id", value: id}); ...

  2. Java - 将可变性最小化

    不可变类,即实例不能被修改的类,实例中包含的所有信息在对象的生命周期内固定不变. 常见的比如String.基本类型的封装类.BigDecimal.BigInteger. 相对与可变类,不可变更易于设计 ...

  3. 在IIs上部署asp.net core2.1项目

    转自:https://www.cnblogs.com/jasonduan/p/9193702.html 在IIS上部署你的ASP.NET Core 2.1项目   1.在控制面板→程序→启用或关闭Wi ...

  4. 十三、栅栏CyclicBarrier

    一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...

  5. 一、cent OS安装配置JDK

    到oracle官网下载JDKhttp://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html 在cent OS ...

  6. sublime text3 JS语法检测插件

    首先ctrl+shift+P用包管理器安装sublimeLinter和sublimeLinter-jshint 前往node官网下载nodejs并安装 安装完node后打开命令行输入npm insta ...

  7. 4 springboot 集成swagger2

    Swagger:实时生成在线接口文档,方便测试和沟通 官网地址:https://swagger.io/ 引入依赖 <dependency> <groupId>io.spring ...

  8. 个人所得税计算java版

    年关将至,该到了发年终奖的时候了.所以就到网上去找下,个税计算器,但是发现做的有点像病毒网站似的.所以计算结果也不太敢信,于是琢磨着,要不自己动手写一个个税计算器吧. 说干就干,先上国家税务局了解了下 ...

  9. springcloud 集成kafka问题记录,发消息报错:ERROR o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='{-1,

    在springcloud集成kafka,发送消息时报错: 2018-08-15 16:01:34.159 [http-nio-8081-exec-1] INFO  org.apache.kafka.c ...

  10. asp.net修改上传文件大小

    我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.config中的httpRunti ...