题意:给出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?≤?n; xi?≠?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 .
版权声明:本文为博主原创文章,未经博主允许不得转载。