zoukankan      html  css  js  c++  java
  • P1364 医院设置 洛谷

    https://www.luogu.org/problem/show?pid=1364

    题目描述

    设有一棵二叉树,如图:

                                             

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

    若医院建在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


    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #define maxn 100000007
    #define haha 115
    using namespace std;
    
    int n,l,r;
    int a[haha][haha],s[haha]; 
    
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                a[i][j]=maxn;
        for(int i=1;i<=n;i++)
        {
            a[i][i]=0;
            cin>>s[i]>>l>>r;
            if(l>0)
                a[i][l]=a[l][i]=1;
            if(r>0)
                a[i][r]=a[r][i]=1;
        }
        for(int k=1;k<=n;k++)
            for(int i=1;i<=n;i++)
                if(k!=i)
                    for(int j=1;j<=n;j++)
                        if(j!=i&&j!=k)
                            a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
        int minn=maxn,tot;
        for(int i=1;i<=n;i++)
        {
            tot=0;
            for(int j=1;j<=n;j++)
                tot+=a[i][j]*s[j];
            minn=min(minn,tot);
        }
        cout<<minn;
        return 0;
    }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    poj 1014||hdu 1059 dividing(多重背包 二进制优化)
    Java多线程循环打印ABC的5种实现方法
    java资料搜索网站
    idea 离线安装 lombok插件
    解决TIME_WAIT过多造成的问题
    JAVA线程池详解
    linux vmstat命令
    Mysql慢查询
    sql中强制使用索引
    JAVA 利用 jmc或jvisualvm 监控 本地或者远程JVM
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6445009.html
Copyright © 2011-2022 走看看