送你一颗圣诞树【DP】【DFS】

>Description
再过三个多月就是圣诞节了,小R 想送小Y 一棵圣诞树作为节日礼物。因为他想让这棵圣诞树越大越好,所以当然是买不到能够让他满意的树的,因此他打算自己把这棵树拼出来。
现在,小R 开始画这棵树的设计图纸了。因为这棵树实在太大,所以他采用了一种比较方便的方法。首先他定义了m+ 1 棵树T0 到Tm。最开始他只画好了T0 的图纸:就只有一个点,编号为0。
接着,对于每一棵树Ti,他在第Tai 棵树的第ci 个点和第Tbi 棵树的第di 个点之间连上了一条长度为li 的边。在Ti 中,他保持Tai 中的所有节点编号不变,然后如果Tai 中有s 个节点,他会把Tbi 中的所有节点的编号加上s。
终于,他画好了所有的树。现在他定义一颗大小为n 的树的美观度为在这里插入图片描述
,其中d(i,j)为这棵树中i 到j 的最短距离。
为了方便小R 选择等究竟拼哪一棵树,你可以分别告诉他T1 到Tm 的美观度吗?答案可能很大,请对10^9 + 7 取模后输出。


>Input
第一行输入一个正整数T 表示数据组数。每组数据的第一行是一个整数m,接下来m 行每行五个整数ai, bi, ci, di, li,保证0 <= ai, bi < i, 0<= li<= 10^9,ci, di 存在。

>Output
对于每组询问输出m 行。第i 行输出Ti 的权值


>Sample Input
1
2
0 0 0 0 2
1 1 0 0 4

>Sample Output
2
28

对于30% 的数据,m <= 8
对于60% 的数据,m <= 16
对于100% 的数据,1 <= m<= 60,T<= 100


>解题思路
我改了超级久的题(我的码太丑了很容易打错TT)。

题目大意就是每次将两棵树合并形成一棵新的树,求每棵树所有点到其他点的最短路的和。
我比赛时只想到暴力,然后打着打着发现太麻烦而且不是正解所以就放弃了,正解是DP

我们每一次把两棵树合并,暴力求最短路,太费时间了,所以我们只用每次把答案进行合并就可以了。
a n s [ k ] ans[k] ans[k]为第 k k k棵树的答案, t o p [ k ] [ x ] top[k][x] top[k][x]为在第 k k k棵树中,所有点走到 x x x节点的最短路和(其实对于一棵树不走重复路径的路只有一条,所以我们可以把最短两个字忽略), s i z e [ k ] size[k] size[k]为第 k k k棵树的大小
推算一下可以得出状态转移方程(a,b,c,d,l题目所示):
a n s [ k ] = a n s [ a [ k ] ] + a n s [ b [ k ] ] + l [ k ] ∗ s i z e [ a [ k ] ] ∗ s i z e [ b [ k ] ] ans[k]=ans[a[k]]+ans[b[k]]+l[k]*size[a[k]]*size[b[k]] ans[k]=ans[a[k]]+ans[b[k]]+l[k]size[a[k]]size[b[

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值