这个题目让我想起了上次在湘潭赛的那道跪死了的题。也是最值问题,这个也是,有n个动物园 每个都有权值 然后被m条路径相连接,保证图是连通的,然后求所有的p[i][j]之和.i,j为任意两个zoo,pij就为i到j路上遇到的包括i j在内的最小权值的zoo

然后我就焦头烂额了一下,这个明显就是看某个最小值为最后的结果发挥了多少次作用,但这个是图,要知道某个节点到底给多少条路径贡献出了最小值,还真是有点没头绪(在已知的复杂度一看 最多只能用nlogn的),最后是看了解答才知道的

用并查集来解决某个最小值到底出现多少次,首先 其实不要被点弄得迷糊了,先落实到边权值来,每条边的权值就等于两个端点中那个小的,然后我们可以发现最大的边,仅仅只会对两个端点的那条路产生影响,然后次大的边,会对自己 以及他的邻边若是最大边,也会产生影响。

这就要用到并查集了,首先所用的点都是独立集,然后从最大的边开始,如果两个端点不在一个集合,便并在一起,并且这次边产生的影响次数 为 rank[r1]*rank[r2],用乘法原理得出,因为是降序的,已经合并起来的点,全都是经历了更长的边,所以用乘法原理,当前两个端点所在集合的个数互乘一下,便是此刻的边产生的影响次数。

这样一下来,便可算出结果。

不得不是,并查集虽然写起来简单,真的是奥妙无穷。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = +;
struct node
{
int u,v,w;
bool operator <(const node&rhs) const{
return w>rhs.w;
}
}E[N];
int A[N];
int f[N],sum[N];
int cnt,n,m;
void add(int a,int b)
{
E[cnt].u=a;
E[cnt].v=b;
E[cnt++].w=min(A[a],A[b]);
}
int findset(int x)
{
if (x!=f[x]) f[x]=findset(f[x]);
return f[x];
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
cnt=;
for (int i=;i<=n;i++){
scanf("%d",&A[i]);
f[i]=i;sum[i]=;
}
int a,b;
for (int i=;i<=m;i++){
scanf("%d%d",&a,&b);
add(a,b);
}
sort(E,E+m);
double ans=;
for (int i=;i<m;i++){
int r1=findset(E[i].u);
int r2=findset(E[i].v);
if (r2!=r1){
ans+=(double)sum[r1]*sum[r2]*E[i].w*1.0;
f[r1]=r2;
sum[r2]+=sum[r1];
}
}
ans*=2.0;
ans/=(double)(n*1.0*(n-));
printf("%.6lf\n",ans);
}
return ;
}

Codeforces 437D 贪心+并查集的更多相关文章

  1. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  2. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  3. codeforces 651E E. Table Compression(贪心+并查集)

    题目链接: E. Table Compression time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  4. Codeforces 731C Socks 并查集

    题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...

  5. codeforces 722C (并查集)

    题目链接:http://codeforces.com/contest/722/problem/C 题意:每次破坏一个数,求每次操作后的最大连续子串和. 思路:并查集逆向操作 #include<b ...

  6. poj1456(贪心+并查集)

    题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...

  7. POJ - 1456 贪心+并查集

    做法一:直接贪心,按照利润排序,然后直接尽量给每个活动安排到最晚的时间即可.时间复杂度O(n * d)当d都为10000时,很容易超时.由于这题数据比较水,所有贪心未超时. AC代码 #include ...

  8. poj1456 Supermarket 贪心+并查集

    题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...

  9. GYM 101173 F.Free Figurines(贪心||并查集)

    原题链接 题意:俄罗斯套娃,给出一个初始状态和终止状态,问至少需要多少步操作才能实现状态转化 贪心做法如果完全拆掉再重装,答案是p[i]和q[i]中不为0的值的个数.现在要求寻找最小步数,显然要减去一 ...

随机推荐

  1. 有关《查找两个List中的不同元素》的问题解答与编程实践

     郑海波 2013-07-08 问题: 有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样查找两个集合中不同的元素呢? ...

  2. Ubuntu18.04 ElasticSearch7.3.2集群搭建(一)

    集群规划: Hostname Elasticsearch Kibana Marvel Marvel Client node01 √ √ √ √ node02 √ √ node03 √ √ node04 ...

  3. 【题集】k倍区间(抽屉原理)

    例1:http://lx.lanqiao.cn/problem.page?gpid=T444 蓝桥杯 问题描述 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, A ...

  4. 转linux top 命令

    top 命令 每天一个linux命令(44):top命令 非常好的一篇博文,这位作者<每天一个linux命令>系列写的非常棒! 关于top的cpu使用率超过100% 在环境中会出现这种现象 ...

  5. Windows 10长脸了!

    Windows 10一直毁誉参半,但是在微软的持续升级完善之下,同时随着时间的流逝,已经顺利成为全球第一大桌面操作系统,并开始逐渐甩开Windows 7,全球设备安装量已经达到约8亿部. 根据最新的S ...

  6. day02-Python运维开发基础

    1. Number 数据类型 2. 容器数据类型-字符串 """ 语法: "字符串" % (值1,值2 ... ) 占位符: %d 整型占位符 %f ...

  7. elasticsearch-java客户端测试

    1.环境准备 (1)添加依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifa ...

  8. 我的Grunt之旅-初识gruntfile文件

    时间:2018-03-06 18:23  事件:配置 gruntfile.js文件 首先,回忆一下之前的点,grunt项目下面必须有两个文件  ,第一个  package.json ,第二个  Gru ...

  9. axios 如何取消已发送的请求?

    前言 最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数据,这就会造成数据和我选择的内容不一致的问题.解决的方案:在后续发送请求时,判断之前的 ...

  10. git杂碎汇总

    1. .gitignore文件使用 1.如果不想某类文件(编译后.配置等文件)加入到git版本管理,可以在这个文件中配置规则,进行过滤筛选: 2.配置规则 以斜杠"/"表示目录:e ...