当前位置: 首页 > news >正文

Codeforces D - The Child and Zoo

D - The Child and Zoo

思路:

并查集+贪心

每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序

然后用并查集从大的边开始合并,因为你要合并的这两个联通块之间的点肯定要经过这条边,而这条要合并的边是所有已经合并中的最小的,所以两个联通块之间的所有点之间的f就是这条边(而且是所有情况最大的,因为是从最大的边开始贪心的)。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=1e5+5;
struct edge{
    int u,v,w;
    bool operator < (edge t){
        return w>t.w;
    }
}edge[N];
int cnt[N];
int rnk[N];
int par[N];
int a[N];
void init(int n){
    for(int i=0;i<=n;i++)par[i]=i,cnt[i]=1;
}
int find(int x){
    if(x==par[x])return x;
    else return par[x]=find(par[x]);
}
void unite(int x,int y){
    int px=find(x);
    int py=find(y);
    if(px!=py){
        if(rnk[px]<rnk[py]){
            par[px]=py;
            cnt[py]+=cnt[px];
        }
        else{
            if(rnk[px]==rnk[py]){
                rnk[px]++;
            }
            par[py]=px;
            cnt[px]+=cnt[py];
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,u,v;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    int c=0;
    while(m--){
        cin>>u>>v;
        edge[c].u=u;
        edge[c].v=v;
        edge[c++].w=min(a[u],a[v]);
    }
    sort(edge,edge+c);
    init(n);
    ll ans=0;
    for(int i=0;i<c;i++){
        int pu=find(edge[i].u);
        int pv=find(edge[i].v);
        if(pu!=pv){
            ans+=(ll)edge[i].w*cnt[pu]*cnt[pv];
            unite(edge[i].u,edge[i].v);
        }
    }
    cout<<fixed<<setprecision(6)<<ans*2.0/(1.0*(n-1)*n)<<endl;
    return 0;
}

 

转载于:https://www.cnblogs.com/widsom/p/8366282.html

相关文章:

  • struct net_device网络设备结构体详解
  • Python操作MySQL数据库的三种方法
  • 如何下载腾讯视频的视频转为MP4常用格式视频
  • FreeBSD-musb_otg文件详解
  • centos7 安装wps 后 演示无法启动
  • NSString属性什么时候用copy,什么时候用strong?
  • 使用Visual Studio Code对Node.js进行断点调试
  • CentOS7.2升级openSSH为7.5P1无法登录的处理过程
  • linux复盘:mysql双主与mysql-proxy实现读写分离
  • 10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通
  • 三角形内随机生成一个点
  • 04.spring security oauth2认证中心 集成zuul网关的代码分析
  • 2018 掌握好这几点方法学习Linux,一定比别人更快入门运维!
  • python小白项目推荐
  • 使用Jackson来实现java对象和json格式的相互转换
  • 08.Android之View事件问题
  • Angular 响应式表单 基础例子
  • angular2 简述
  • Asm.js的简单介绍
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • E-HPC支持多队列管理和自动伸缩
  • ES2017异步函数现已正式可用
  • git 常用命令
  • Git的一些常用操作
  • input实现文字超出省略号功能
  • JSDuck 与 AngularJS 融合技巧
  • Js基础——数据类型之Null和Undefined
  • Redis 中的布隆过滤器
  • Shell编程
  • SpingCloudBus整合RabbitMQ
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 第十八天-企业应用架构模式-基本模式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 飞驰在Mesos的涡轮引擎上
  • 浏览器缓存机制分析
  • 面试遇到的一些题
  • 判断客户端类型,Android,iOS,PC
  • 使用agvtool更改app version/build
  • 最近的计划
  • ​2020 年大前端技术趋势解读
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #100天计划# 2013年9月29日
  • %check_box% in rails :coditions={:has_many , :through}
  • (4)STL算法之比较
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (转)大道至简,职场上做人做事做管理
  • (转)关于pipe()的详细解析
  • .md即markdown文件的基本常用编写语法
  • .net CHARTING图表控件下载地址
  • .net 反编译_.net反编译的相关问题