医院设置【题目链接】

感觉我超废


我是一个连floyd都不会写了的灵魂OI选手qwq(考场上写了半天spfa然后写炸了(微笑))

floyd的暴力:

1.先建树:用邻接矩阵存。存之前记得先初始化为INF

注意是无向图。然后注意自己到自己的情况dis值=0;

2.跑一遍floyd,求最短路;

3.枚举每个点建医院,相当于求每个点作为源点的单源最短路,然后乘people数,比较大小,输出最小的一个;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
const int INF=; using namespace std; int n,dis[][],sum;
struct people{
int num,l,r;
}p[]; int main(){ memset(dis,INF,sizeof(dis));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&p[i].num,&p[i].l,&p[i].r);
if(p[i].l) dis[i][p[i].l]=,dis[p[i].l][i]=;
if(p[i].r) dis[i][p[i].r]=,dis[p[i].r][i]=;
dis[i][i]=;
} for(int k=;k<=n;k++){//floyd
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
}
}
int minn=INF;
for(int i=;i<=n;i++){//求单源最短路+乘起来;
sum=;
for(int j=;j<=n;j++)
sum+=dis[i][j]*p[j].num;
if(sum<minn) minn=sum;
}
cout<<minn<<endl;
return ;
}

又是water_lift的非暴力解法:

首先建树,water_lift是利用了“父子”关系建成的树,定义一个队列,依次枚举以每个结点做根的情况,然后修改权值,

开二维数组dis[i][j]和bool判断数组vis[i],分别表示从i=>j的权值大小,是否已经计算过了,然后再跑二重循环,将dis[i][j]与对应的人数相乘,比较取最小的(好像ans是water_lift用来记录哪个结点是根的

撒花☆☆☆☆

#include <iostream>
#include <queue>
#include <cstring>
#include <limits.h>
using namespace std;
int n;
int lch[], rch[], fa[], sum[];
int dis[][];
bool vis[];
int root;
int main()
{
cin >> n;
for (int i = ; i <= n; i++)
{
cin >> sum[i] >> lch[i] >> rch[i];
fa[lch[i]] = fa[rch[i]] = i;
}
for (int i = ; i <= n; i++)//好像也没用
{
root = i;
}
for (int i = ; i <= n; i++)
{
queue<int> q;
q.push(i);
memset(vis, , sizeof(vis));
vis[i] = ;
dis[i][i] = ;
while (!q.empty())
{
int node = q.front();
q.pop();
if (lch[node] && !vis[lch[node]])//保证左儿子右儿子以及父亲都被算到
//(这里的父亲是名义上的父亲,对于选择不同结点做根,父亲与儿子的分布是不同的
{
q.push(lch[node]);
vis[lch[node]] = ;
dis[i][lch[node]] = dis[i][node] + ;
}
if (rch[node] && !vis[rch[node]])
{
q.push(rch[node]);
vis[rch[node]] = ;
dis[i][rch[node]] = dis[i][node] + ;
}
if (fa[node] && !vis[fa[node]])
{
q.push(fa[node]);
vis[fa[node]] = ;
dis[i][fa[node]] = dis[i][node] + ;
}
}
}
int ans, ansv = INT_MAX;
for (int i = ; i <= n; i++)
{
int nowans = ;
for (int j = ; j <= n; j++)
{
nowans += dis[i][j] * sum[j];
}
if (nowans < ansv)
{
ansv = nowans;
ans = i;//好像没有用
}
}
cout << ansv << endl;
}

跑去luogu上学习了一下O(n)的算法

大概是没看懂(微笑狗)

end-

【6.10校内test】T2 医院设置的更多相关文章

  1. 【6.10校内test】 noip模拟

    题目链接: p1  FBI树 p2  医院设置 p3  加分二叉树 | | | | | | 分 界 线 | | | | | | 应该算是一篇反思博. 对于OI,我真的算不上是热爱(当然不热爱不代表就不 ...

  2. codevs 2577 医院设置

    2577 医院设置 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold   题目描述 Description 设有一棵二叉树,如下图 其中,圈中数字表示结点居民的人口.圈边 ...

  3. 医院设置x

    医院设置x   题目描述 Description 设有一棵二叉树,如下图 其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,.现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小, ...

  4. P1364 医院设置 (补锅,memset初始化较大值不可用0x7fffffff )

    P1364 医院设置 题解 弗洛伊德水过 注意初始化一个大数 0x3f 可以,0x5f 好像也可以,但是0x7fffffff 我是真的炸了,初始化为-1 (后面补锅有详细解释) 代码 #include ...

  5. 【模板】树的重心 洛谷P1364 医院设置

    P1364 医院设置 题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接 ...

  6. 【7.10校内test】T2不等数列

    [题目链接luogu] 此题在luogu上模数是2015,考试题的模数是2012. 然后这道题听说好多人是打表找规律的(就像7.9T2一样)(手动滑稽_gc) 另外手动 sy,每次测试都无意之间bib ...

  7. django 1.10.3 admin后台管理设置显示中文

    在网上搜索的什么设置settings.py的LANGUAE_CODE,在1.10.3下完全不行,直接报错,后来使用了django.middleware.locale.LocaleMiddleware才 ...

  8. Windowns Server 2016 + Nginx 1.10.2 + PHP 7.1.0 + Laravel 5.3 + Mariadb 10.1.19 开发环境设置

    1.设置PHP 1.1.官网下载PHPhttp://windows.php.net/downloads/releases/php-7.1.0-nts-Win32-VC14-x86.zip 1.2.解压 ...

  9. Mac 10.14.5系统偏好设置安全性与隐私不展示任何来源解决办法

    Mac新系统升级(10.14.5)后未从appstore下载的软件在安装时会提示安装包已损坏之类的东东,这是因为没有打开“设置”—“安全与隐私”中的“任何来源”造成的,可是升级后的10.14.5却没有 ...

随机推荐

  1. MTBF测试

    本文转载自:https://blog.csdn.net/liuhaoemail/article/details/50531489 MTBF测试 目前,终端侧的可靠性测试基本上是采用称为”MTBF测试” ...

  2. c++ STL map 用法

    map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  3. springboot集成fastjson

    @Configuration @EnableWebMvc public class WebMvcConfigurer extends WebMvcConfigurerAdapter { /** * f ...

  4. Vue/Element-ui 安装搭建开发环境(一)

    Element 是饿了么全段开发团队推出的一套基于 vue.js2.0 的 PC Web 端开发框架. Element 中文文档:https://element.eleme.cn/#/zh-CN 1. ...

  5. install_github无法安装 Rwebdriver包的解决方法

    1.通过install_githtb安装Rwebdriver包的错误如下: 提示不能打开URL,但是将URL地址输入浏览器地址栏,则可以下载包到本地 2.在网上搜索,发现可以通过本地文件来安装(ins ...

  6. jQuery.parseJSON()

    https://api.jquery.com/jQuery.parseJSON/ https://api.jquery.com/category/deprecated/deprecated-3.0/ ...

  7. 什么是webpack以及为什么使用它

    什么是webpack以及为什么使用它 新建 模板 小书匠  在ES6之前,我们要想进行模块化开发,就必须借助于其他的工具.因为开发时用的是高级语法开发,效率非常高,但很可惜的是,浏览器未必会支持或认识 ...

  8. python 整数转字节 char

    把10进制整数30,转换为字节 方法一 chr(30).encode() 结果 方法二 struct.pack('B', 30) 结果 准确地讲,Python没有专门处理字节的数据类型.但由于str既 ...

  9. word中打字会覆盖下一个字

    insert键 误按了insert键,此时Word默认为改写模式,输入文本会覆盖后面的内容.

  10. 【mysql】查询最新的10条记录

    实现查询最新10条数据方法: select * from 表名 order by id(主键) desc limit 10 参考文档: MySQL查询后10条数据并顺序输出