[luoguP1364] 医院设置(树的重心)】的更多相关文章

传送门 假设数据再大些,我这就是正解,然而题解里总是各种水过. 两边dfs,一遍求重心,一遍统计距离. ——代码 #include <cstdio> #include <cstring> #define MAXN 1001 using namespace std; int n, cnt, tot, ans, sum; int head[MAXN], next[MAXN], to[MAXN], val[MAXN], size[MAXN], dis[MAXN], f[MAXN]; in…
传送门闷闷闷闷闷闷 ~~放一个可爱的输入框.~~ 考虑在O(n)的时间内求数以每个节点为医院的距离和. \(设想一下,如果我们已知以1为根节点的距离和f[1],如何求出子节点呢?\) 当医院从1转换到1的儿子节点2 一.那么2为根的子树节点到医院的距离都减少1 二.其余节点到医院的距离都增加1 所以得出方程\(f[v]=f[u]-size[v]+(size[1]-size[v])\) 其中\(size[i]\)表示以i为根的子树节点数的权值和 #include <bits/stdc++.h>…
P1364 医院设置 题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l.如上图中, 若医院建在1 处,则距离和=4+12+2*20+2*40=136:若医院建在3 处,则距离和=4*2+13+20+40=81…… 输入输出格式 输入格式: 第一行一个整数n,表示树的结点数.(n≤100) 接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空…
树的重心的定义: 树若以某点为根,使得该树最大子树的结点数最小,那么这个点则为该树的重心,一棵树可能有多个重心. 树的重心的性质: 1.树上所有的点到树的重心的距离之和是最短的,如果有多个重心,那么总距离相等. 2.插入或删除一个点,树的重心的位置最多移动一个单位. 3.若添加一条边连接2棵树,那么新树的重心一定在原来两棵树的重心的路径上. 当然,这题我们只需要用到第一条性质. 怎么求树的重心: 定义几个数组:\(f[u]\)表示以u为根的总距离,\(size[u]\)表示以u为根的子树的大小(…
To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点. 输入输出格式 输入格式: 第一行.一个数n,表示有n个村民. 接下来n-1行,每行两个数字a和b,表示村民a的家和村民b的家之…
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的分界点就是树上的一条边.于是考虑枚举断哪条边,然后对两边分别跑一遍带权树的重心,统计答案加起来取最小值就行了. 现在进行优化,求树的重心的方法可以参考医院设置. 以\(1\)为根建树,\(f[u]\)表示所有点到\(u\)的总距离.(人数乘以距离) 转移方程是: \[f[v]=f[u]+size[1…
2577 医院设置 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold   题目描述 Description 设有一棵二叉树,如下图 其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻结点之间 的距离为1.如上图中,若医院建在: 1处:则距离之和=4+12+2*20+2*40=136 3处:则距离之和=4*2+13+20+40=81 ……. 输入描述 Input Descript…
题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为l.如上图中, 若医院建在1 处,则距离和=4+12+2*20+2*40=136:若医院建在3 处,则距离和=4*2+13+20+40=81…… 输入输出格式 输入格式: 第一行一个整数n,表示树的结点数.(n≤100) 接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,…
医院设置x   题目描述 Description 设有一棵二叉树,如下图 其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻结点之间 的距离为1.如上图中,若医院建在: 1处:则距离之和=4+12+2*20+2*40=136 3处:则距离之和=4*2+13+20+40=81 …….   图片没弄上哈见谅见谅,codevs上有     输入描述 Input Description 第一行一个整数n,表示树的结…
医院设置[题目链接] 感觉我超废 我是一个连floyd都不会写了的灵魂OI选手qwq(考场上写了半天spfa然后写炸了(微笑)) floyd的暴力: 1.先建树:用邻接矩阵存.存之前记得先初始化为INF 注意是无向图.然后注意自己到自己的情况dis值=0: 2.跑一遍floyd,求最短路: 3.枚举每个点建医院,相当于求每个点作为源点的单源最短路,然后乘people数,比较大小,输出最小的一个: #include<iostream> #include<cstdio> #includ…