首页 > 其他分享 >医院设置(二叉树)

医院设置(二叉树)

时间:2023-10-07 16:14:13浏览次数:29  
标签:vis ll juli 距离 gen 医院 二叉树 设置 zuo

https://www.luogu.com.cn/problem/P1364
这道题是个二叉树(为什么有人要去用dfs,bfs去做??(▔___▔))

题目描述
这道题让我们在这棵树上修建一家医院,而且让人们到医院的距离和最短,距离和也就是每一个点到医院的距离*这个点上有的人数(就这么简单)

首先我们可以建一个结构体,里面存了每一个点的信息:人数,左子树,右子树,根节点,到医院的距离。

struct node{
    ll shu,zuo,you,gen,ju;//人数,左子树,右子树,根节点,距离
}a[110];

照着输入,可是问题来了,它的根节点怎么求?

很简单,就是把它的左子树还有右子树的根节点标记为i,就解决了。

for(int i=1;i<=n;i++){
    cin>>a[i].shu>>a[i].zuo>>a[i].you;//人数,左子树,右子树
    a[a[i].zuo].gen=i;//标记
    a[a[i].you].gen=i;
}

后面开一个for,枚举如果第i个点就是医院,算出他的距离和,再取最小值
那每一个点到医院的距离怎么求?

可以写个函数计算,代码如下:

void juli(ll k,ll h){//这个点,它的距离,初始值就是i和0
    a[k].ju=h;//把距离赋值
    vis[k]=1;//标记,不然有的点有可能重复计算
    if(a[k].zuo!=0&&vis[a[k].zuo]==0) juli(a[k].zuo,h+1);//左子树不    为空并且他没有被标记过,进左子树,距离+1
    if(a[k].you!=0&&vis[a[k].you]==0) juli(a[k].you,h+1);//右子树不为空并且他没有被标记过,进右子树,距离+1
    if(a[k].gen!=0&&vis[a[k].gen]==0) juli(a[k].gen,h+1);//根节点不为空并且他没有被标记过,进根节点,距离+1
    return ;//返回
}

 

注:每一次vis数组都要清0
计算距离和不用说:

for(int j=1;j<=n;j++) sum+=a[j].ju*a[j].shu;//距离*人数

 

最后再取一个最小值,输出答案,就可以了

附上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
    ll shu,zuo,you,gen,ju;
}a[110];
ll vis[110],n,ans=0x3f3f3f3f;
void juli(ll k,ll h){
    a[k].ju=h;
    vis[k]=1;
    if(a[k].zuo!=0&&vis[a[k].zuo]==0) juli(a[k].zuo,h+1);
    if(a[k].you!=0&&vis[a[k].you]==0) juli(a[k].you,h+1);
    if(a[k].gen!=0&&vis[a[k].gen]==0) juli(a[k].gen,h+1);
    return ;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].shu>>a[i].zuo>>a[i].you;
        a[a[i].zuo].gen=i;
        a[a[i].you].gen=i;
    }
    for(int i=1;i<=n;i++){
        //假设a[i]为医院
        memset(vis,0,sizeof(vis));
        juli(i,0);
        ll sum=0;
        for(int j=1;j<=n;j++) sum+=a[j].ju*a[j].shu;
        ans=min(ans,sum);
    }cout<<ans;
    return 0;
}     

 

标签:vis,ll,juli,距离,gen,医院,二叉树,设置,zuo
From: https://www.cnblogs.com/lutaoquan/p/17746546.html

相关文章

  • vscode设置文件忽略
    转到顶部菜单中的"文件"(File)>"首选项"(Preferences)>"设置"(Settings)或者您可以使用快捷键Ctrl+,或Cmd+,打开设置。在设置页面中,搜索框内输入"files.exclude" 在这里添加即可 ......
  • 如何对RS485设备进行地址的设置? 关于485通讯常见问题
    https://www.juyingele.com/service/2199.html 如何对RS485设备进行地址的设置?单独连接一个设备时,不管设备地址是多少,都可以使用254(广播地址)进行通讯。传输方式不同、传输距离不同、RS-232只允许一对一通信。1、传输方式不同。RS-232采取不平衡传输方式,即所谓单端......
  • Multisim 12.0-虚拟MOS管简单设置
    在软件中NMOS-FET使用需要设置参数,否则没作用简单的方法:其他用默认值,只要修改参数:M多重性导通关系M:10000Vgs:1VIds:100mAVgs:2VIds:400mAM:1000Vgs:1VIds:10mAVgs:2VIds:40mA关系大致如下:I=vvM*k......
  • 二叉树的性质和特点
    性质1:在二叉树的第i层上至多有2i-1个结点(i>=1)性质2:深度为k的二叉树至多有2k-1个结点(k>=1)性质3:对任何一颗二叉树T,如果其叶子数为n0,度为2的节点数为n2,则n0=n2+1......
  • idea自定义设置背景图片
      这样就设置完成了......
  • app直播源代码,JavaWeb如何设置定时任务
    app直播源代码,JavaWeb如何设置定时任务1.在xml文件中添加监听器 <?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • openEuler忘记密码,如何重新设置
     启动openEuler,出现开机画面时,按下字母E mount-oremount,rw/ 输入新的密码:例如,openeuler21.09,需要输入两次回车确认执行成功后,输入命令3:touch/.autorelabelexit关机重启即可 ......
  • 最优二叉树—哈夫曼(huffman)树
    哈夫曼树又称最优二叉树,是一类带权路径长度最短的二叉树,有着广泛的应用。基本概念权:将树中的结点赋上一个有着某种意义的数值路径:从A结点道B结点所经过的分支序列路径长度:从A结点道B结点所经过的分支数目查找效率平均查找长度(ASL)取决于树的高度ASL=(1+2*2+3)/4=2     ......
  • 医院信息系统
    一、什么是HIS系统HIS系统(HospitalInformationSystem)是医院信息化建设的核心组成部分,它是为了管理和运营医院而设计和开发的一套综合性的信息系统。HIS系统通过整合医院各个部门和业务流程的数据和信息,实现了医院内部的信息共享和协同工作,提高了医疗服务的质量和效率。 HI......
  • 二叉树遍历(后序遍历)
    口诀:先左再右再根......