题目描述

有一个村庄居住着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. "类工厂模式"改写SqlHelper

    看到标题您一定很疑惑,23种经典设计模式什么时候多了一个"类工厂模式",稍等,请听我慢慢道来. 实践是检验真理的唯一途径.最近用了"类工厂模式"改写了我公司的S ...

  2. 关系型数据库之MySQL基础总结_part1

    一:数据库的操作语言的种类 MySQL 是我们最常使用的关系型数据库,对于MySQL的操作的语言种类又可以分为:DDL,DML,DCL,DQL DDL:是数据库的定义语言:主要对于数据库信息的一些定义 ...

  3. Java线程入门第二篇

    Java线程通信方法 0.(why)每个线程都有自己的栈空间,我们要线程之间进行交流,合作共赢. 1.synchronized和volatile关键字 a)  看下面的synchronized关键字 ...

  4. JDBC增加、更新、删除数据

    JDBC增加.更新.删除数据 st.executeUpdate(sql) 进行插入.更新.删除操作返回的是受影响的记录的条数 注意:输入的sql语句中,vachar类型记住加单引号 完整代码如下: p ...

  5. C#对Windows服务组的启动与停止

    Windows服务大家都不陌生,Windows服务组的概念,貌似MS并没有这个说法. 作为一名软件开发者,我们的机器上安装有各种开发工具,伴随着各种相关服务. Visual Studio可以不打开,S ...

  6. LocalStorage和sessionStorage之间的区别

    众所周知,自从HTML 5 标准出现之后,本地化存储一度成为热搜的关键词.在HTML 5 最开始时,本地存储有两种方式:一种是web Storage,另一种是web SQL.由于web SQL的实现是 ...

  7. DOM基础代码练习(一)

    上一篇介绍了一下DOM的一些基础的知识,这里我整理了一些有关上一篇知识点的一些封装函数. 1.遍历元素节点 function retChild(node) { var child = node.chi ...

  8. vue-router初涉

    概念: vue-router: vue官方路由插件. 路由: 指单页面应用的路径管理系统.在vue中都是单页应用,相当于只有一个index.html页面,所以无法使用<a>标签,我们使用路 ...

  9. 20条最最常用的Linux命令讲解

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  10. 如何验证一份HTML文档的格式是否正确

    在浏览器中打开 Markup Validation Service . 点击或者激活 Validate by Direct Input 栏. 将整个示范文档的代码(不仅仅是body部分)复制粘贴到在M ...