医院设置【题目链接】

感觉我超废


我是一个连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. 执行jar包某类命令

    #!/bin/bash ulimit -SHn 65535 export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 library_path="$ ...

  2. C++ -- 类与成员

    一.初始化列表 1.是构造函数中一种成员的初始化方式   例如,class    类名 { 类名(参数列表):成员1(成员1),成员2(成员2)... {   } } 2.用此方法可以解决类中的成员与 ...

  3. 文本框——EditText

    长度

  4. 【Leetcode】2的幂(整数的二进制形式,与运算)

    class Solution { public: bool isPowerOfTwo(int n) { ) return false; )) == ; } }; 注: 1) 2的幂函数,其y值大于0: ...

  5. Android 5种Toast特效

    Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.   1.默认效果: Toast.ma ...

  6. Monkeyrunner自动化测试由浅入深(第一节)

    (原版)Monkeyrunner自动化测试由浅入深(第一节) 博主原创,请勿转载 第一.相关软件和环境的配置 1.Android sdk下载和配置 2.java jdk下载和配置 第二.Monkeyr ...

  7. sqli-labs(10)

    基于双引号的时间盲注 先来随便测试一下 发现 错不错都是返回的真确的结果 那么应该是被从定向了 我们可以输入 and sleep(5) %23 测试 加’发现立刻返回 加双引号发现报错了 过了5秒才返 ...

  8. 异步实时搜索jquery select插件

    异步实时搜索jquery select插件 一.先看看效果. 二.做此插件的原因. 1.数据量过大(几千.几万条),无法一次性全部加载. 2.现有插件各不相同,无法满足功能需求. 3.美观性,可控性不 ...

  9. ffplay播放YUV数据

    播放器YUV系列的格式用ffplay很方便 免费的 播放NV21 ffplay -i d:/cap.yuv -pix_fmt nv21 -s 640x480 播放YUV420P ffplay -i d ...

  10. ide破解

    https://blog.csdn.net/yangying496875002/article/details/73603303