W 国的交通呈一棵树的形状。W 国一共有 n−1 个城市和 n 个乡村,其中城市从 1 到 n−1 编号,乡村从 1 到 n 编号,且 1 号城市是首都。道路都是单向的,本题中我们只考虑从乡村通往首都的道路网络。
对于每一个城市,恰有一条公路和一条铁路通向这座城市。对于城市 i, 通向该城市的道路(公路或铁路)的起点,要么是一个乡村,要么是一个编号比 i 大的城市。没有道路通向任何乡村。除了首都以外,从任何城市或乡村出发只有一条道路;首都没有往外的道路。从任何乡村出发,沿着唯一往外的道路走,总可以到达首都。
W 国的国王小 W 获得了一笔资金,他决定用这笔资金来改善交通。由于资金有限,小 W 只能翻修 n−1 条道路。小 W 决定对每个城市翻修恰好一条通向它的道路,即从公路和铁路中选择一条并进行翻修。小 W 希望从乡村通向城市可以尽可能地便利,于是根据人口调查的数据,小 W 对每个乡村制定了三个参数,编号为 i 的乡村的三个参数是 ai,bi 和 ci。假设从编号为 i 的乡村走到首都一共需要经过 x 条未翻修的公路与 y 条未翻修的铁路,那么该乡村的不便利值为:
ci⋅(ai+x)⋅(bi+y)
在给定的翻修方案下,每个乡村的不便利值相加的和为该翻修方案的不便利值。 翻修 n−1 条道路有很多方案,其中不便利值最小的方案称为最优翻修方案,小 W 自然希望找到最优翻修方案,请你帮助他求出这个最优翻修方案的不便利值。
输入格式
第一行为正整数 n。
接下来 n−1 行,每行描述一个城市。其中第 i 行包含两个数 si,ti。si 表示通向第 i 座城市的公路的起点,ti 表示通向第 i 座城市的铁路的起点。如果si>0,那么存在一条从第 si 座城市通往第 i 座城市的公路,否则存在一条从第 −si 个乡村通往第 i 座城市的公路;ti 类似地,如果 ti>0,那么存在一条从第 ti 座城市通往第 i 座城市的铁路,否则存在一条从第 −ti 个乡村通往第 i 座城市的铁路。
接下来 n 行,每行描述一个乡村。其中第 i 行包含三个数 ai,bi,ci,其意义如题面所示。
输出格式
输出一行一个整数,表示最优翻修方案的不便利值。
思路:dp(树形dp)
负数的处理
题中提到,乡村的节点编号为负值。为了避免下标越界,可以把所有负数的 i 加上数组长度 N。
此时,−i→N−i。
dp表
在一个节点上,存在 3 个变量:
当前的节点 i
到首都 1 号节点的公路 ld
到首都 1 号节点的铁路 rd
因此,使用三维的dp表。
dp[i][ld][rd]:节点 i,距离首都 ld 条公路、rd 条铁路的总不便利值。
为了避免溢出,使用long long类型。
同时,记录不翻修时节点 i 的公路、铁路数 ldepth[i],rdepth[i];记录每个节点的左右子节点 lson[i],rson[i]。
int lson[N]; // Highway int rson[N]; // Railway int a[N], b[N], c[N]; int ldepth[N]; // total number of highways int rdepth[N]; // total number of railways
int lson[N]; // Highway int rson[N]; // Railway int a[N], b[N], c[N]; int ldepth[N]; // total number of highways int rdepth[N]; // total number of railways