医院设置


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

医院设置

题目背景

在一棵给定的二叉树上,每个结点代表一个住户点并携带人口权重。相邻结点间的路程均为 \(1\)。现需选择一个结点建立医院,使得全体居民到该医院的加权路程之和最小

题目描述

给定一棵含有 \(n\) 个结点的二叉树。每个结点 \(i\) 有:

  • 人口 \(w_i\);
  • 左孩子编号 \(u_i\)(\(0\) 表示无左孩子);
  • 右孩子编号 \(v_i\)(\(0\) 表示无右孩子)。

树中所有边(父子关系)视为无向,任意相邻结点间距离为 \(1\)。请确定在哪个结点建立医院可以使加权距离和最小,并输出该最小值。


输入格式

  • 第一行:一个整数 \(n\)(结点数)。
  • 接下来 \(n\) 行:每行三个整数 \(w, u, v\),分别表示该结点的人口与其左、右孩子编号(\(0\) 表示无该孩子)。

约定:结点按 \(1\ldots n\) 编号;输入保证结构为一棵树。


输出格式

  • 输出一行,一个整数,表示最小加权距离和

样例

输入
5
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0
输出
81
样例解析

若医院建在结点 \(1\),则总路程为 \(4 + 12 + 2\times20 + 2\times40 = 136\); 若建在结点 \(3\),则为 \(4\times2 + 13 + 20 + 40 = 81\),更优。


数据范围

  • \(1 \le n \le 100\)
  • \(0 \le u, v \le n\)
  • \(1 \le w \le 10^5\)

Comments

There are no comments at the moment.