2020杭电多校第六场 1006 A Very Easy Graph Problem

题目

在这里插入图片描述

题目大意:
给定一张无向图,图中点分为黑点和白点。对于第i条边,其边长为2i,问所有黑白点之间最短路之和。


生成树

这个题仔细思考一下,不难发现对于第i条边,有

21 + 22 + … + 2i-1 < 2i
即前面所有的边权和加起来也没有这一条边这么多,因此当第i条边加入时,可以连通的黑点和白点间产生的路径就是最短路径。如果这条边连接的两个顶点已经连通,则不用加入改点。

分析到这里,前面的部分就可以使用并查集直接维护一颗生成树了。接着这个问题就变成了树上统计问题。

树上统计

生成树过后,问题就转变为在一棵无根树上,所有的黑白点对之间的距离和是多少。

为了解决这个问题,我们可以在每一个节点统计几个值:

  • sum,以该节点为根的子树中所有黑白点对的距离和
  • dp[0][0],子树中所有黑节点到该节点的距离和
  • dp[0][1],子树中黑节点的数量
  • dp[1][0],子树中所有白节点到该节点的距离和
  • dp[1][1],子树中白节点的数量
  • color,节点颜色

不难得到以下转移

对于节点k,其父节点为f:

子树节点颜色数量统计有:
n o d e [ k ] . d p [ 0 ] [ 1 ] = ∑ e ( j , k ) , j ≠ f n o d e [ j ] . d p [ 0 ] [ 1 ] node[k].dp[0][1] = \sum_{e(j,k),j≠f} node[j].dp[0][1] node[k].dp[0][1]=e(j,k),j=fnode[j].dp[0][1]
n o d e [ k ] . d p [ 1 ] [ 1 ] = ∑ e ( j , k ) , j ≠ f n o d e [ j ] . d p [ 1 ] [ 1 ] node[k].dp[1][1] = \sum_{e(j,k),j≠f} node[j].dp[1][1] node[k].dp[1][1]=e(j,k),j=fnode[j].dp[1][1]
子树距离和统计有:
n o d e [ k ] . d p [ 0 ] [ 0 ] = ∑ e ( j , k ) , j ≠ f ( n o d e [ j ] . d p [ 0 ] [ 0 ] + n o d e [ j ] . d p [ 0 ] [ 1 ] ∗ w ( e ) ) node[k].dp[0][0] = \sum_{e(j,k),j≠f} (node[j].dp[0][0] +node[j].dp[0][1]*w(e)) node[k].dp[0][0]=

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值