codeforce 437 D The Child and Zoo

题意:给出n个带权值的点,m条边,任意两点之间的一条路径的权值为这条路径上的所有点中的最小权值,任意两点间的权值为它们之间所有路径的权值中最大的那个。

做法:考虑下并查集,就是首先把所有边降序排序,然后开始建立并查集,若要加入的两点已经在同一个集合中,那么已经贡献到了ans,不用管了,若不在,则进行合并,利用乘法原理也就是两个集合元素数量相乘算出它们之间能够形成多少路径,这些路径的权值就是这两个点的最小权值,然后贡献给ans,不断如此,就可算出答案。还是很有意思的。

#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
#include<bitset>
#include<climits>
#include<list>
#include<iomanip>
#include<stack>
#include<set>
using namespace std;
int fa[100010],num[100010],val[100010];
int dfs(int v)
{
	return fa[v]=v==fa[v]?v:dfs(fa[v]);
}
struct Edge
{
	int u,v;
	bool operator <(Edge one)const
	{
		return min(val[u],val[v])>min(val[one.u],val[one.v]);
	}
}edge[100010];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>val[i];
	for(int i=0;i<m;i++)
		cin>>edge[i].u>>edge[i].v;
	sort(edge,edge+m);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		num[i]=1;
	}
	double ans=0;
	for(int i=0;i<m;i++)
	{
		int a=dfs(edge[i].u),b=dfs(edge[i].v);
		if(a!=b)
		{
			ans+=double(num[a])*num[b]*min(val[edge[i].u],val[edge[i].v]);
			fa[a]=b;
			num[b]+=num[a];
		}
	}
	ans=ans*2/n/(n-1);
	printf("%.5f\n",ans);
}

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n.
The i-th area contains ai animals
in it. Also there are m roads in the zoo, and each road connects two distinct areas. Naturally the zoo is connected, so you can reach
any area of the zoo from any other area using the roads.

Our child is very smart. Imagine the child want to go from area p to area q.
Firstly he considers all the simple routes from p to q.
For each route the child writes down the number, that is equal to the minimum number of animals among the route areas. Let‘s denote the largest of the written numbers as f(p,?q).
Finally, the child chooses one of the routes for which he writes down the value f(p,?q).

After the child has visited the zoo, he thinks about the question: what is the average value of f(p,?q) for all pairs p,?q (p?≠?q)?
Can you answer his question?

Input

The first line contains two integers n and m (2?≤?n?≤?105; 0?≤?m?≤?105).
The second line contains n integers: a1,?a2,?...,?an (0?≤?ai?≤?105).
Then follow m lines, each line contains two integers xi and yi (1?≤?xi,?yi?≤?nxi?≠?yi),
denoting the road between areas xi and yi.

All roads are bidirectional, each pair of areas is connected by at most one road.

Output

Output a real number — the value of .

The answer will be considered correct if its relative or absolute error doesn‘t exceed 10?-?4.

Sample test(s)

input

4 3
10 20 30 40
1 3
2 3
4 3

output

16.666667

input

3 3
10 20 30
1 2
2 3
3 1

output

13.333333

input

7 8
40 20 10 30 20 50 40
1 2
2 3
3 4
4 5
5 6
6 7
1 4
5 7

output

18.571429

Note

Consider the first sample. There are 12 possible situations:

  • p?=?1,?q?=?3,?f(p,?q)?=?10.
  • p?=?2,?q?=?3,?f(p,?q)?=?20.
  • p?=?4,?q?=?3,?f(p,?q)?=?30.
  • p?=?1,?q?=?2,?f(p,?q)?=?10.
  • p?=?2,?q?=?4,?f(p,?q)?=?20.
  • p?=?4,?q?=?1,?f(p,?q)?=?10.

Another 6 cases are symmetrical to the above. The average is .

Consider the second sample. There are 6 possible situations:

  • p?=?1,?q?=?2,?f(p,?q)?=?10.
  • p?=?2,?q?=?3,?f(p,?q)?=?20.
  • p?=?1,?q?=?3,?f(p,?q)?=?10.

Another 3 cases are symmetrical to the above. The average is .

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 01:03:26

codeforce 437 D The Child and Zoo的相关文章

Codeforces 437 D. The Child and Zoo 并查集

题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.如果有多条路的话,要取最大的值作为路径的长度.问,平均两个区之间移动的权值为多少. 题解: 每条边的长度已经知道了,因为路径的权值取这条路中最小的且多条路的话则取较大的,那么我们其实可以从比较大的边开始取(先把边排序),用并查集开始合并

Codeforces Round #250 (Div. 1) B. The Child and Zoo(排序+并查集)(常规好题)

B. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The i-th area contains 

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

题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去参观动物园,动物园分很多个区,每个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.问,平均两个区之间移动的权值为多少. 解题思路:并查集+贪心.将所有的边按照权值排序,从最大的开始连接,每次连接时计算的次数为连接两块的节点数的积(乘法原理). #in

[CF#250 Div.2 D]The Child and Zoo(并查集)

题目:http://codeforces.com/problemset/problem/437/D 题意:有n个点,m条边的无向图,保证所有点都能互通,n,m<=10^5 每个点都有权值,每条边的权值定义为这条边连接两点的权值中的最小值. f(p,q)表示p到q的路径中边权的最小值,如果有多条路经,就取每条路径最小值中的最小值 要求的就是对于所有1<=p<=n,1<=q<=n,p≠q,f(p,q)的平均值 分析: 刚开始是想考虑每条边对总和的贡献,结果没想通. 一个很巧的办法

D. The Child and Zoo

http://codeforces.com/contest/437/problem/D 贪心,按照自身的费用从大到小拿,费用的相等先后顺序不影响结果 1 import java.util.*; 2 3 public class Main { 4 static final int MAX = Integer.MAX_VALUE; 5 6 public static void main(String[] args) { 7 Scanner io = new Scanner(System.in); 8

D. The Child and Zoo 2

http://codeforces.com/contest/437/problem/D 排序+并查集 为了理解原理,让我们先画一个圈: 其中红边无限大,黑边值为0 我们可以发现,红边的值:1.直接就是f(1,2),2.毫不影响剩下的f(1,3).f(1,4).f(2,3).f(2,4).f(3,4)的值 所以对应的,我们可以得出:1.当它是图里最大的边时,它的贡献可求,2.球完之后,它唯一的作用就是确保连通性,除此之外就是个摆设 而题目里求所有点对的f()值等价于求所有边对所有点对的贡献 解决1

Codeforces 437D The Child and Zoo

这个题还是很好的 有几个套路 先是我们看到题目中让我们处理点权,但是我们发现并不好处理 所以就先化点为边 (套路1) 把每一条边的边权视作边所连接的两个点的\(min\)值 然后我们看到这个题有路径的问题,就先还是要较大的 可以比较显然地想到最大生成树 (套路2) 在\(Kruskal\)中改一下排序方式就行了 然后我们看到不是生成树上的边都我们在考虑走的时候都不会考虑 考虑每一个树边的贡献 连接两个联通块的时候 这一条边会产生\(val[edge]* size[x]* size[y]\)的贡献

Codeforces Round #250 (Div. 1)B(排序+并查集)

B. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The i-th area contains 

站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展

距离上次更新博客,时隔略长,诸事繁琐,赶在去广州答辩之前,分享下安卓 android 中的一个 列表收缩 类---ExpandableListView 先上效果图: 如果想直接看实现此页面的代码请下滑到 红线 下 关于这个类的具体各函数的使用说明,这里不作详细说明,提供一个链接http://www.apkbus.com/android-124715-1-1.html,里面有关于此类的详细介绍. 我在这里主要通过源代码的注释和必要的说明,说明如何实现自定义的收缩列表. 必要的函数: 0-> 1 E