The Child and Zoo 题解
题目描述
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 sum of f(p, q) for all pairs p, q (p ≠ q)? Can you answer his question?
对于一张图我们定义一个快乐值为f(p,q)为p到q的简单路径上最小点权值的最大值,求出所有f(p,q)(p != q)的和。(CF437D是求的平均值, 需要在此基础上除以一个(n(n-1)))
输入输出格式
输入格式:
The first line contains two integers n and m (2 ≤ n ≤ 10^5; 0 ≤ m ≤ 10^5). The second line contains n integers: a1, a2, ..., an (0 ≤ ai ≤ 10^5). 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.
第一行输入两个数n,m表示点数和边数
第二行有n个数,表示每个点的权值
第三行到第3 + m行每行有两个数,表示连个点之间有条边
输出格式:
Output a integer — the value of sum .
一行一个整数,表示所有f(u, v) (u != v)的和。
题解
由题目的描述我们可以知道我们所有要经过的路径一定是在该图的最大生成树上的,但是这道题没有边权只有点权,所以我们要定义两个点之间的边权w[u,v] = min(a[u],a[v]) (w[u, v]表示两点之间的边权,a[u]表示u的点权)。在有了这棵树之后,我们需要的就只是两个点之间的路径权值了。刚开始我想了n^2暴力枚举两个点,然后求LCA之后再求最短长度,但时间超了,于是我们考虑下述做法:
我们在建立最小生成树的过程就是利用并查集将两个连通块连通的过程,因为树上两个点之间的路径是唯一的,所以连通两个连通块后有且只有这两个连通块之间的点连通了但不对连通块内部造成影响。而且我们是按从大到小的顺序去枚举的边, 所以这条新连接的树边一定是这两个连通块之间两点路径的开心值。于是我们只用在维护并查集的同时维护一下并查集的大小,然后根据乘法原理就可以解决了。
代码
#include <bits/stdc++.h>
using namespace std; const int MAX = ;
int Father[MAX], size[MAX]; inline int Get_Father(int x)
{
return Father[x] == x ? x : Father[x] = Get_Father(Father[x]);
} struct Edge
{
int from, to, w;
}edge[MAX]; int a[MAX]; bool comp(const Edge & a, const Edge & b)
{
return a.w > b.w;
} int main()
{
// freopen("zoo.in", "r", stdin);
// freopen("zoo.out", "w", stdout);
int n, m;
int x, y;
scanf("%d%d", &n, &m);
//printf("%d %d", n, m);
for(register int i = ; i <= n; ++ i) scanf("%d", &a[i]), Father[i] = i, size[i] = ;
for(register int i = ; i <= m; ++ i)
{
scanf("%d%d", &x, &y);
edge[i].from = x, edge[i].to = y, edge[i].w = min(a[x], a[y]);
}
sort(edge + , edge + m+, comp);
int tot = ; long long ans = ;
for(register int i = ; i <= m; ++ i)
{
if(tot == n - ) break;
x = Get_Father(edge[i].from), y = Get_Father(edge[i].to);
if(x == y) continue;
ans = ans +(long long) size[x] * size[y] * edge[i].w;
size[x] += size[y];
Father[y] = x;
tot ++;
}
printf("%lld\n", ans << );
return ;
}
The Child and Zoo 题解的更多相关文章
- Codeforces Round #250 (Div. 1) B. The Child and Zoo 并查集
B. The Child and Zoo Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/438/ ...
- cf437D The Child and Zoo
D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces 437 D. The Child and Zoo 并查集
题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么 ...
- CF437D(The Child and Zoo)最小生成树
题目: D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Codeforces 437D The Child and Zoo(贪心+并查集)
题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...
- Codeforces 437D The Child and Zoo - 树分治 - 贪心 - 并查集 - 最大生成树
Of course our child likes walking in a zoo. The zoo has n areas, that are numbered from 1 to n. The ...
- Codeforces D - The Child and Zoo
D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联 ...
- Codeforces Round #250 (Div. 2) D. The Child and Zoo 并查集
D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces 437D The Child and Zoo(并查集)
Codeforces 437D The Child and Zoo 题目大意: 有一张连通图,每个点有对应的值.定义从p点走向q点的其中一条路径的花费为途径点的最小值.定义f(p,q)为从点p走向点q ...
随机推荐
- python 爬虫系列05--丑事百科
丑事百科爬虫 import re import requests def parse_page(url): headers = { 'User-Agent':'user-agent: Mozilla/ ...
- C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密
要求:密码必须包含数字和字母 思路:1.列出数字和字符. 组成字符串 :chars 2.利用randrom.Next(int i)返回一个小于所指定最大值的非负随机数. 3. 随机取不小于chars长 ...
- OpenLayers 案例一
序 OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问. 例子 <!doctype html> <htm ...
- IBM Rational Appscan Part 1
By Rohit T|July 23rd, 2012 http://resources.infosecinstitute.com/ibm-rational-appscan/ IBM Rational ...
- (三)TestNG
1.testNG的部分注解 test测试方法都是执行顺序:并不是从上往下执行的,而是根据方法名ASCII码进行执行的,小的先执行 比如a比b先执行,1比2先执行,不管代码放的顺序是怎么样. impor ...
- tomcat和应用集成
将tomcat作为应用的一部分集成到应用中,使得应用可以直接开启http服务,对外提供接口.此时应用程序不必再遵守j2ee中的文件目录格式要求. 此种方式改变了以往先部署tomcat容器,再按照j2e ...
- CheckBox 样式
.cb td { width: 100px; } .cb label { display: inline-block; ...
- openlayers 聚合效果
//cyd var cydclusterSource = new ol.source.Cluster({ distance: 40, source: new ol.source.Vector({ fe ...
- 洛谷P4632 [APIO2018] New Home 新家(动态开节点线段树 二分答案 扫描线 set)
题意 题目链接 Sol 这题没有想象中的那么难,但也绝对不简单. 首先把所有的询问离线,按照出现的顺序.维护时间轴来处理每个询问 对于每个询问\((x_i, y_i)\),可以二分答案\(mid\). ...
- Android滑动删除功能
今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. ...