首页 > 其他分享 >CF437D The Child and Zoo

CF437D The Child and Zoo

时间:2022-10-14 01:33:25浏览次数:79  
标签:连通 ch int siz 边权 Zoo Child times CF437D

CF437D The Child and Zoo - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

很像货车运输?但是点权?转化一下。每条边 \((u, v)\) 设定边权为 \(\min(a[u], a[v])\),那么一条简单路径的点权最小值和边权最小值就是等价的。

根据货车运输的思想,最大生成树上 \(u\) 到 \(v\) 的简单路径,肯定是原图 \(u\) 到 \(v\) 的那条边权最小值最大的路径。

点对数量 \(n^2\) 明显不支持枚举,但所有点对的 \(f\) 肯定只能是 \(m\) 个边权中的某一个,这启发我们计算每条边的贡献。

发现在最大生成树的连边过程中,每连一条边 \((u, v, w)\) 就把 \(u\) 所在连通块和 \(v\) 所在连通块合并了。此时,\(u\) 所在连通块中任意一个点 \(x\) 到达 \(v\) 所在连通块中任意一个点 \(y\) 的简单路径边权最小值一定是 \(w\)。

证明:连接 \((u, v)\) 后,点 \(x\) 到点 \(y\) 在最大生成树上的简单路径就出现了(之前不连通)。由于我们从大到小选边,所以这条简单路径上最小的边权一定是 \(w\)。

因此一条边的贡献是 \(siz[u] \times siz[v] \times w \times 2\)。其中 \(\times 2\) 是因为 \((p, q)\) 和 \((q, p)\) 都需要统计一次。\(siz[u]\) 是 \(u\) 所在连通块的大小。

容易证明,每一个点对都会恰好被统计一次。最后把结果除以 \(n \times (n - 1)\) 即可得到平均值。

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2022-10-13 23:56:06 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2022-10-14 00:06:16
 */
#include <bits/stdc++.h>
#define int long long
inline int read() {
    int x = 0;
    bool flag = true;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-')
            flag = false;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = (x << 1) + (x << 3) + ch - '0';
        ch = getchar();
    }
    if(flag)
        return x;
    return ~(x - 1);
}

const int maxn = (int)1e5 + 5;
const int maxm = (int)1e5 + 5;

struct edge {
    int u, v, w;
}e[maxm];

int a[maxn];

inline int min(int a, int b) {
    return a < b ? a : b;
}

int fa[maxn], siz[maxn];

inline int get(int x) {
    while (x != fa[x])
        x = fa[x] = fa[fa[x]];
    return x;
}

inline void uni(int x, int y) {
    if (siz[x] > siz[y])
        x ^= y ^= x ^= y;
    fa[x] = y;
    siz[y] += siz[x];
}

signed main() {
    int n = read(), m = read();
    for (int i = 1; i <= n; ++i)
        a[i] = read();
    
    for (int i = 1; i <= m; ++i) {
        int u = read(), v = read();
        int w = min(a[u], a[v]);
        e[i] = (edge){u, v, w};
    }

    std :: sort(e + 1, e + 1 + m, [](edge a, edge b) {
        return a.w > b.w;
    });

    std :: iota(fa + 1, fa + 1 + n, 1);
    std :: fill(siz + 1, siz + 1 + n, 1);
    
    int ans = 0;
    for (int i = 1; i <= m; ++i) {
        int u = e[i].u, v = e[i].v, w = e[i].w;
        u = get(u);
        v = get(v);
        if (u == v)
            continue;
        ans += 2 * siz[u] * siz[v] * w;
        uni(u, v);
    }

    printf("%.6f\n", ans * 1.0 / (n * (n - 1)));
    return 0;
}

标签:连通,ch,int,siz,边权,Zoo,Child,times,CF437D
From: https://www.cnblogs.com/crab-in-the-northeast/p/cf437d.html

相关文章

  • k8s中部署三节点zookeeper集群
    目录k8s中部署三节点zookeeper集群一、部署三节点zookeeper集群注意事项二、yaml文件目录k8s中部署三节点zookeeper集群一、部署三节点zookeeper集群注意事项1、使用S......
  • zookeeper安装
    1)安装前准备(1)安装JDK(2)拷贝apache-zookeeper-3.5.7-bin.tar.gz安装包到Linux系统下(3)解压到指定目录[atguigu@hadoop102software]$tar-zxvfapache-zookeeper-3.......
  • zookeeper脚本
    1)在hadoop102的/home/atguigu/bin目录下创建脚本[atguigu@hadoop102bin]$vimzk.sh 在脚本中编写如下内容#!/bin/bash case$1in"start"){ foriinha......
  • zookeeper集群安装
    1)集群规划在hadoop102、hadoop103和hadoop104三个节点上都部署Zookeeper。思考:如果是10台服务器,需要部署多少台Zookeeper?2)解压安装(1)在hadoop102解压Zookeeper......
  • 03、如何理解Kafka和Zookeeper的关系
    001、Kafka简介ApacheKafka最早是由Linkedin公司开发,后来捐献给了Apack基金会。Kafka被官方定义为分布式流式处理平台,因为具备高吞吐、可持久化、可水平扩展等特性而被......
  • 一点Zookeeper
    Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目Zookeeper的工作机制Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框......
  • 分布式协调服务Zookeeper
    分布式系统概述概念:将硬件或软件组件分布在不同的网络计算机上通过消息传递进行通信和协调特点:分布性对等性平等:无主从之分(机器无主从之分) master/sl......
  • zk api连接超时问题 org.apache.zookeeper.KeeperException$ConnectionLossException:
    遇到org.apache.zookeeper.KeeperException$ConnectionLossException:KeeperErrorCode=ConnectionLossfor/的问题首先让我想到的是,zk所在服务器是开启了防火墙吗?......
  • ZooKeeper系列:zk中的watch
    Watch就是监听,观察。其实就是客户端注册watch,然后服务端发生节点数据变化的时候会触发watch事件,接着回调客户端创建工程和实现类创建java的maven工程,然后在pom中添加对......
  • ZooKeeper
    ZooKeeper作为顶级分布式开源项目,应用非常广泛,Dubbo和Kafka这些知名的开源项目都在使用。之前只是听说过它,并没有仔细研究过。今天带大家来学习下ZooKeeper,主要从ZooKeeper......