当前位置: 首页 > java >正文

洛谷 P1395 会议 -普及/提高-

P1395 会议

题目描述

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

输入格式

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

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

输出格式

一行输出两个数字 xxxyyy

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

yyy 表示距离之和的最小值。

输入输出样例 #1

输入 #1

4
1 2 
2 3 
3 4

输出 #1

2 4

说明/提示

数据范围

对于 70%70\%70% 数据 n≤103n \le 10^3n103

对于 100%100\%100% 数据 n≤5×104n \le 5 \times 10^4n5×104

solution

  • 思路: 其实就是重心,任选一个节点作为 root,第一遍dfs算出各节点子树节点到该节点的距离和,和子树节点个数,第二遍dfs在考虑上从父节点过来的分支距离
  • 具体:
    • 1 设
      f[u]: 以u为根的子树节点距离和,
      siz[u]:以u为根的子树节点个数
      g[u]: 的所有节点到u的距离和
  • 2 递推:v 是 u 的子节点
    • dfs(1, 0)
    •  siz[u] += siz[v];f[u] += siz[v] + f[v];
      
    • dfs2(1, 0)
    •    g[1] = f[1]g[v] = g[u] + (n - 2 * siz[v]);
      

代码

#include<iostream>
#include<algorithm>
#include "cstring"
#include "vector"using namespace std;/** P1395 会议* 题目大意: 有一颗无根无权树,找到树中一个节点,使得其它所有节点的到该点的距离和最小** 思路: 其实就是重心,任选一个节点作为 root,第一遍dfs算出各节点子树节点到该节点的距离和,和子树节点个数* 第二遍dfs在考虑上从父节点过来的分支距离* 具体:* 1 设 f[u]: 以u为根的子树节点距离和,siz[u]:以u为根的子树节点个数,*      g[u]: 的所有节点到u的距离和* 2 递推:v 是 u 的子节点*   dfs(1, 0)*      siz[u] += siz[v];*      f[u] += siz[v] + f[v];*   dfs2(1, 0)*      g[1] = f[1]*      g[v] = g[u] + (n - 2 * siz[v]);**/typedef long long ll;
const int N = 5e4 + 5;int n, siz[N], f[N], g[N], Min, k;
vector<int> e[N];void dfs(int u, int p) {siz[u] = 1;for (int v: e[u]) {if (v == p) continue;dfs(v, u);siz[u] += siz[v];f[u] += siz[v] + f[v];}
}void dfs2(int u, int p) {for (int v: e[u]) {if (v == p) continue;g[v] = g[u] + (n - 2 * siz[v]);if (g[v] < Min || g[v] == Min && v < k) k = v, Min = g[v];dfs2(v, u);}
}int main() {cin >> n;for (int i = 1, x, y; i < n; i++) {cin >> x >> y;e[x].push_back(y);e[y].push_back(x);}dfs(1, 0);Min = f[1], k = 1, g[1] = f[1];dfs2(1, 0);cout << k << ' ' << Min << endl;return 0;
}

结果

在这里插入图片描述

http://www.xdnf.cn/news/19353.html

相关文章:

  • 一款基于selenium的前端验证码绕过爆破工具
  • java怎么实现根据指标预警的功能
  • C++多态介绍
  • 【Leetcode】17、电话号码的字母组合
  • 哪些人需要考道路运输安全员证?政策要求与适用范围
  • C++day2作业
  • 突破视界的边界:16公里远距离无人机图传模块全面解析
  • 毕业项目推荐:47-基于yolov8/yolov5/yolo11的焊缝质量检测识别系统(Python+卷积神经网络)
  • pip 镜像源配置(清华/阿里/豆瓣)详解
  • 智瞰风评 - 基于大语言模型的个人征信报告风险分析师
  • k8s--efk日志收集
  • 用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)
  • Java数组入门教程:零基础掌握数组定义与遍历+新手避坑指南
  • Python3 lambda(匿名函数)
  • 轻量xlsx读取库xlsx_drone的编译与测试
  • 元素滚动scrollIntoView
  • A5M2(数据库管理工具)下载安装
  • 谈物质的运动与运动的物质
  • 智能消防栓闷盖终端:让城市消防管理更智慧高效
  • Robolectric拿到当前的Activity
  • 基于轴重转移补偿和多轴协调的粘着控制方法研究
  • 线性回归算法
  • Lombok(简化Java当中的开发)
  • 下载 | Win11 23H2正式版最新原版ISO系统映像 (22631.5840、多合一版本)-修复系统问题
  • 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统
  • 编程与数学 03-004 数据库系统概论 09_物理结构设计
  • 栈溢出问题
  • 498. 对角线遍历
  • 银河麒麟系统无法打开360浏览器的解决办法以及安装initramfs-tools报错解决方案
  • 10.2 工程学中的矩阵