CF1666J Job Lookup

题目描述

Julia 的 $n$ 个朋友想在他们刚搬到的新国家创办一家初创公司。他们根据各自的工作内容,从最前端的任务到最后端的任务,给彼此分配了 $1$ 到 $n$ 的编号。他们还估算了一个矩阵 $c$,其中 $c_{ij} = c_{ji}$ 表示从事工作 $i$ 和 $j$ 的人每月之间的平均消息数。 现在他们想要建立一个层级树。这个树是一个二叉树,每个节点包含团队中的一名成员。某个成员会被选为团队的领导,作为根节点。为了让领导能够方便地联系任何下属,对于树中的每个节点 $v$,必须满足:其左子树中的所有成员编号都小于 $v$,右子树中的所有成员编号都大于 $v$。 层级树确定后,从事工作 $i$ 和 $j$ 的人将通过树中连接他们节点的最短路径进行交流。我们用 $d_{ij}$ 表示这条路径的长度。因此,他们的通信代价为 $c_{ij} \cdot d_{ij}$。 你的任务是构建一个层级树,使得所有成员对之间的通信总成本 $\sum_{1 \le i < j \le n} c_{ij} \cdot d_{ij}$ 最小。

输入格式

第一行包含一个整数 $n$($1 \le n \le 200$),表示组织初创公司的团队成员数。 接下来的 $n$ 行,每行包含 $n$ 个整数,第 $i$ 行第 $j$ 个数为 $c_{ij}$,表示成员 $i$ 和成员 $j$ 之间每月的消息数估计值($0 \le c_{ij} \le 10^9$;$c_{ij} = c_{ji}$;$c_{ii} = 0$)。

输出格式

输出一个能使通信总成本最小的层级树的描述。对于每个编号从 $1$ 到 $n$ 的成员,输出其父节点的成员编号,如果该成员是领导,则输出 $0$。如果有多个最优解,输出任意一个即可。

说明/提示

最小可能的通信总成本为 $566 \cdot 1+239 \cdot 1+30 \cdot 1+1 \cdot 2+1 \cdot 2=839$: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1666J/7d043f0dc31fa1bc60f31358d0ccffe9104138cc.png) 由 ChatGPT 4.1 翻译