医院设置【题目链接】

感觉我超废


我是一个连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. pt-config-diff的使用记录

    pt-config-diff的使用记录 pt-config-diff功能:比较差异两套库配置差不多,性能就是不一样,无奈之举,去比对数据库配置是否相同. 运行的MySQL和运行的MySQL做对比 [r ...

  2. 【NOIP2016提高A组模拟10.15】最大化

    题目 分析 枚举两个纵坐标i.j,接着表示枚举区域的上下边界, 设对于每个横坐标区域的前缀和和为\(s_l\),枚举k, 显然当\(s_k>s_l\)时,以(i,k)为左上角,(j,k)为右下角 ...

  3. Java 内置锁 重入问题

    阅读<Java并发编程实战>,遇到了一个问题 代码如下 /** * @auther draymonder */ public class Widget { public synchroni ...

  4. Python文件对象方法

    使用open()函数创建一个文件对象,这里是可以在这个对象上调用的函数的列表 - 编号 方法名称 描述 1 file.close() 关闭文件,无法读取或写入关闭的文件. 2 file.flush() ...

  5. [BZOJ2560]串珠子:状压DP+容斥原理

    分析 为什么我去年6月做过这道题啊,估计当时抄的题解. 具体做法就是令\(f[S]\)表示保证连通点集\(S\)的方案数,\(g[S]\)表示不保证连通点集\(S\)的方案数. 容易想到: \[g[S ...

  6. 20道JS原理题助你面试一臂之力!(转)

    20道JS原理题助你面试一臂之力! 前言 本文针对目前常见的面试题,仅提供了相应的核心原理及思路,部分边界细节未处理.后续会持续更新,希望对你有所帮助. 1. 实现一个call函数 // 思路:将要改 ...

  7. 正则表达式中 group groups区别

    先看代码instance: 1 >>> a="123abc456" 2 >>> import re 3 >>> print(r ...

  8. 2018-2019-2 20165235《网络对抗技术》Exp7 网络欺诈防范

    2018-2019-2 20165235<网络对抗技术>Exp7 网络欺诈防范 实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法 实验内容 (1)简单应 ...

  9. mysql 5.7 安装配置及无法启动的问题解决

    (用这篇配置就能正常配置成功) mysql 免安装版配置方法: https://www.jb51.net/article/134452.htm 参考:https://blog.csdn.net/qq_ ...

  10. Linux编译部署vsftp服务

    部署vsftp服务   Hostname OS IP Software Vsftpsvr RHEL-5.8 10.0.0.58 yum install -y vsftpd yum install –y ...