最小生成树+DFS求任意两点间平均路径长度 ——Abandoned country (HDU 5732)( 2016Multi-University Training Contest 1 1001 )

使用Kruskal算法构建唯一最小生成树,通过DFS计算每条边在所有路径中出现的频率,进而求得任意两点间的平均路径长度。详细解题过程包括边的记录和DFS搜索策略。
摘要由CSDN通过智能技术生成
  • 题目链接:
    http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1001&cid=704

  • 分析:
    点数最大为100000,所以最小生成树应该用Kruskal。因为任意两点的距离不相等,所以最小生成树唯一,那么期望也就是唯一的。而这个期望即任意两点距离的平均值。我们先统计出每条边在所有路径中被用到的次数,用它乘以这条边的权重,加在一块然后除以总路径数(n×(n-1)/2)就能得到结果。

  • 题解:

    1. 在kruskal的取边操作里,如果某条边符合条件被选中,这时候加一个操作,把这条边记录到数组里(一条边从两个方向要被记录两次),然后用一个add函数将每条边加入到新的结构体里面,这个结构体的序号是边的序号,里面存储这条边的下一个节点,以及这个边的权重,然后记录这条边的下一条边的序号。
    2. DFS函数:任取一个点作为根节点开始搜索,对每个点i记录其子树包含的点数(包括其自身),设点数为sum[i],则i的父亲一侧的点数即为n-sum[i]。两者相乘就是这条边被用到的次数,边遍历边统计。

      • P.S. :此处DFS以及add函数的详细分析可以参考 树形DP中的DFS函数与head数组。
        DFS 代码:
struct edge
{
    int from,to,w,next;
}e[1000050];

void add(int from,int to,int w) 
{
    e[cont].to=to;
    e[cont].w=w;
    e[cont].next=head[from];
    head[from]=cont++;
}
ll Dfs(int u)
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值