• 2577 医院设置


    2577 医院设置

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 黄金 Gold 
     
    题目描述 Description

    设有一棵二叉树,如下图

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

    1处:则距离之和=4+12+2*20+2*40=136

    3处:则距离之和=4*2+13+20+40=81

    输入描述 Input Description

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

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

    输出描述 Output Description

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

    样例输入 Sample Input

    5

    13 2 3

    4 0 0

    12 4 5

    20 0 0

    40 0 0

    样例输出 Sample Output

    81

    数据范围及提示 Data Size & Hint

    思路:spfa+暴力

     1 #include<cstdio>
     2 #include<cstring>
     3 
     4 int map[101][101];
     5 int peo[101];
     6 int dis[101];
     7 int team[101],head,tail;
     8 bool vis[101];
     9 int n,sum,ans,minn=9999999;
    10 void juli(int a)
    11 {
    12     memset(dis,127,sizeof(dis));
    13     memset(vis,0,sizeof(vis));
    14     memset(team,0,sizeof(team));
    15     tail=0;
    16     head=0;
    17     dis[a]=0;
    18     vis[a]=1;
    19     team[tail++]=a;
    20     while(head<tail)
    21     {
    22         int d=team[head];
    23         head++;
    24         for(int i=1;i<=n;++i)
    25         {
    26             if(map[d][i]&&dis[i]>dis[d]+map[d][i])
    27             {
    28                 dis[i]=map[d][i]+dis[d];
    29                 if(!vis[i])
    30                 {
    31                     team[tail++]=i;
    32                     vis[i]=1;
    33                 }
    34             }
    35         }
    36         vis[d]=0;
    37     }
    38     for(int i=1;i<=n;++i)
    39     {
    40         sum+=peo[i]*dis[i];
    41     }
    42 }
    43 int main()
    44 {
    45     scanf("%d",&n);
    46     for(int i=1;i<=n;++i)
    47     {
    48         int a,b,c;
    49         scanf("%d%d%d",&c,&a,&b);
    50         if(a)
    51         {
    52             map[i][a]=1;
    53             map[a][i]=1;
    54         }    
    55         if(b)
    56         {
    57             map[b][i]=1;
    58             map[i][b]=1;
    59         }
    60         peo[i]=c;
    61     }
    62     for(int i=1;i<=n;++i)
    63     {
    64         sum=0;
    65         juli(i);
    66         if(sum<minn)
    67         {
    68             minn=sum;
    69         }
    70     }
    71     printf("%d",minn);
    72     return 0;
    73 }
  • 相关阅读:
    b站漫画部门测试面经
    b站测试面经
    面试7
    面试6
    UI自动化测试:App的Webview页面元素左滑删除
    UI自动化测试:TouchAction & TouchActions区别
    UI自动化测试:获取元素隐藏属性
    iOS自动化测试元素定位
    UI自动化测试:测试异步场景的临时处理
    UI自动化测试:异常标签页切换
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6744276.html
Copyright © 2020-2023  润新知