题目描述

设有一棵二叉树,如图:

其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为1。如上图中,

若医院建在1 处,则距离和=4+12+2*20+2*40=136;若医院建在3 处,则距离和=4*2+13+20+40=81……

输入输出格式

输入格式:

第一行一个整数n,表示树的结点数。(n≤100)

接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。

输出格式:

一个整数,表示最小距离和。

输入输出样例

输入样例#1:

5
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0
输出样例#1: 
 81
简单!看着 n 的范围 Floyed 都可以吧,不过还是坚持用了SPFA。

思路:
有几个人那这个节点的边权就给乘以几,作为他的边权,要确定哪个节点最合适,
那就每个节点跑跑最短路试试吧,确定总距离最小的那个结点。
(听起来好像有点暴力,不过在luogu上跑到了0ms,哎呦,不错哦) 废话不多说上代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
int n,head[],tot,shu[],ans,p;
struct ahah{
int nxt,to,w;
}edge[]; //记住数组要开大一点。
void add(int x,int y,int z)
{
edge[++tot].nxt=head[x];edge[tot].to=y;edge[tot].w=z;head[x]=tot;
} //链表建边。
queue <int> que;
int dis[],vis[],sum;
void spfa(int s)
{
for(int i=;i<=p;i++) dis[i]=;
memset(vis,,sizeof(vis));
dis[s]=;vis[s]=;que.push(s);
while(!que.empty())
{
int cur=que.front() ;
vis[cur]=; que.pop() ;
for(int i=head[cur];i;i=edge[i].nxt)
{
int now=edge[i].to;
if(dis[now]>dis[cur]+edge[i].w)
{
dis[now]=dis[cur]+edge[i].w;
if(!vis[now])
{
vis[now]=;
que.push(now);
}
}
}
}
sum=;
for(int i=;i<=p;i++)sum+=dis[i]*shu[i]; //统计总长度。
}
int main()
{
int vv=;
scanf("%d",&n);
p=n;
int x,y,z;
while(n--)
{
scanf("%d%d%d",&z,&x,&y);
ans++;
shu[ans]=z;
add(ans,x,);add(x,ans,); //双向建边。
add(ans,y,);add(y,ans,);
}
for(int i=;i<=p;i++)
{
spfa(i); //挨个边跑跑。
vv=min(vv,sum);
}
printf("%d",vv);
}

此为个人略解,转载请标明出处:http://www.cnblogs.com/rmy020718/p/8834789.html

  那年你一袭袈裟相思放下,可曾记得我儒染风华青丝白发,一语落罢,却是一盏清茶。

 

luogu P1364 医院设置的更多相关文章

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

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

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

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

  3. P1364 医院设置 洛谷

    https://www.luogu.org/problem/show?pid=1364 题目描述 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结 ...

  4. 洛谷P1364 医院设置(Floyd)

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

  5. P1364 医院设置

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

  6. [LUOGU] 1364 医院设置

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

  7. 洛谷 P1364 医院设置

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

  8. P1364 医院设置(树型结构)

    传送门闷闷闷闷闷闷 ~~放一个可爱的输入框.~~ 考虑在O(n)的时间内求数以每个节点为医院的距离和. \(设想一下,如果我们已知以1为根节点的距离和f[1],如何求出子节点呢?\) 当医院从1转换到 ...

  9. 洛谷P1364 医院设置

    LITTLESUN的第一道图论,撒花~~ 题目链接 这道题是Floyd的板子题 注意对于矩阵图的初始值赋值要全部赋值成最大值 十六进制的最大值表示方式是0x3f3f3f3f memset(G,0x3f ...

随机推荐

  1. E20180410-hm

    preface  n. 序言,引语; 开端,前奏; [宗] (弥撒的) 序诵,序祷;        vi. 作序; 作为…的序言,作为…的开端; 给…作序; 开始,导致; continue vi. 持 ...

  2. Codeforces626B - Cards【模拟】

    题意: 两张相同可以合并成相同: 两张不同可以产生另外一个不同: 求最终的可能颜色: 思路: 模拟啊. 总共也就那么几种情况,具体看挫code--. #include<iostream> ...

  3. 求一元二次方程的根【double型的0输出%.2lf为-0.00】

    #include <bits/stdc++.h> using namespace std; #define LL long long #define eps 1e-6 int main() ...

  4. (2)javascript的基本语法、数据结构、变量

    本篇学习资料主要讲解javascript的基本语法.数据结构.变量      无论是传统的编程语言,还是脚本语言,都具有数据类型.常量和变量.运算符.表达式.注释语句.流程控制语句等基本元素构成,这些 ...

  5. springcloud(一) 服务拆分

    一般我们的项目如果需要从单应用服务升级到微服务,必须要将原来的服务做拆分,我这边的拆分也是基于将之前spb-demo的springboot单应用做拆分,拆分出三个应用,spb-brian-query- ...

  6. 7天学完Java基础之1/7

    方法重载 package cn.itcat.day04.demo01; //方法重载就是参数个数不同,参数类型不同,参数类型的顺序不同 //方法重载与参数名称无关,与方法返回值类型无关 //方法重载方 ...

  7. C++类 单冒号

    1.继承 class Base { }; class Derived : public Base { }; 示列: class Base   { public: int a=10;  }; class ...

  8. 洛谷 P2158 [SDOI2008]仪仗队 && 洛谷 P1447 [NOI2010]能量采集

    https://www.luogu.org/problemnew/show/P2158 以人所在位置为(0,0)建立坐标系, 显然除了(0,1)和(1,0)外,可以只在坐标(x,y)的gcd(x,y) ...

  9. Magic Numbers CodeForces - 628D

    Magic Numbers CodeForces - 628D dp函数中:pos表示当前处理到从前向后的第i位(从1开始编号),remain表示处理到当前位为止共产生了除以m的余数remain. 不 ...

  10. vmware虚拟机启动centOs黑屏

    如图所示  , 我的VM 启动虚拟机之后就变成了上面的样子,一直不动,ping也ping不好,这个时候 : 1. 要么 内存不够了: 2. 要么 网络协议存在问题了: 本地windows环境在管理员的 ...