医院设置【题目链接】

感觉我超废


我是一个连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. jvm——CMS 垃圾回收器(未完)

    https://matt33.com/2018/07/28/jvm-cms/ 阶段1:Initial Mark stop-the-wolrd 标记那些直接被 GC root 引用或者被年轻代存活对象所 ...

  2. 《转》从系统和代码实现角度解析TensorFlow的内部实现原理 | 深度

    from https://www.leiphone.com/news/201702/n0uj58iHaNpW9RJG.html?viewType=weixin 摘要 2015年11月9日,Google ...

  3. spring mvc @Valid 数据验证

    //对书的单价校验不能是空,价格在20-100之间   @DecimalMax(value = "100", message = "价格不超过100元")   ...

  4. postman添加测试

    我们有的时候可能需要登陆才能使用下面的接口 解决方案.在浏览器中找到cookie.然后放在postman中的Headers中

  5. H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。

    手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在 ...

  6. Pycharm,出现Invalid VCS root mapping The directory 解决方法

    Pycharm File 中setting-------version control  中VCS选择none  后选择ok 执行完以上的步骤,还错误就会消失.

  7. D. Print a 1337-string...

    D. Print a 1337-string... 输出一个字符串 里面包含n个子序列 1337 #include<bits/stdc++.h> using namespace std; ...

  8. android 3.0 ationbar使用总结

    1,ationbar的基本讲解 http://www.apkbus.com/forum.php?mod=viewthread&tid=125536 仅仅需要根据需求写出一个menu资源文件 2 ...

  9. 线下作业MySQL #20175201

    1.下载附件中的world.sql.zip, 参考http://www.cnblogs.com/rocedu/p/6371315.html#SECDB,导入world.sql,提交导入成功截图 2.编 ...

  10. 一、基础篇--1.1Java基础-包装类的装箱和拆箱

    包装类:java是典型的面向对象编程,但是八种基本数据类型并不支持面向对象编程.基本类型的数据不具备对象的特性,没有属性和方法.沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单.有效地进行常规数据 ...