博客
关于我
P1364 医院设置
阅读量:795 次
发布时间:2023-02-26

本文共 1315 字,大约阅读时间需要 4 分钟。

医院设置的优化方法

又是一道水题。数据特别水,O(n^3)都能过,但我不会用暴力枚举的方法。我这里要讲的是一种O(n)的做法,能够在洛谷的五个数据点上实现5个0ms。

大家可以先看一下博客,但主要关注重心的求法。这里用的是加权重心,比重心更高级的一种。只需把DFS里的size[x]=1改为size[x]=dis[x],把DFS里的size[x]*2>=n改为size[x]*2>=tot就好了(tot是所有点的权值的和)。

代码如下:

#include 
#define N 420int next[N], to[N], num, head[N], size[N], dis[N], father[N], deep[N], n, ans, ans, a, b, c, tot;void add(int false_from, int false_to) { next[++num] = head[false_from]; to[num] = false_to; head[false_from] = num;}int dfs(int x) { size[x] = dis[x]; for (int i = head[x]; i; i = next[i]) if (father[x] != to[i]) { father[to[i]] = x; dfs(to[i]); size[x] += size[to[i]]; } if (size[x] * 2 >= tot && !ans) ans = x;}void dfss(int x) { anss += (deep[x] - 1) * dis[x]; for (int i = head[x]; i; i = next[i]) if (!deep[to[i]]) { deep[to[i]] = deep[x] + 1; dfss(to[i]); }}int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d%d%d", &a, &b, &c); dis[i] = a; tot += a; if (b) { add(i, b); add(b, i); } if (c) { add(i, c); add(c, i); } } dfs(1); deep[ans] = 1; dfss(ans); printf("%d", anss); return 0;}

这个程序在洛谷没问题,但对其他题则需要调整数组大小。

转载自:链接

你可能感兴趣的文章
OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
查看>>
OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
查看>>
OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
查看>>
OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
查看>>
OpenPPL PPQ量化(5):执行引擎 源码剖析
查看>>
openpyxl 模块的使用
查看>>
OpenResty(nginx扩展)实现防cc攻击
查看>>
Openresty框架入门详解
查看>>
OpenResty(1):openresty介绍
查看>>
OpenResty(2):OpenResty开发环境搭建
查看>>
openshift搭建Istio企业级实战
查看>>
Openstack 之 网络设置静态IP地址
查看>>
OpenStack 搭建私有云主机实战(附OpenStack实验环境)
查看>>
OpenStack 综合服务详解
查看>>
OpenStack 网络服务Neutron详解
查看>>
Openstack 网络管理企业级实战
查看>>
Openstack(两控制节点+四计算节点)-1
查看>>
openstack--memecache
查看>>
openstack-keystone安装权限报错问题
查看>>