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 ...
随机推荐
- Transform 引起的 z-index "失效"
重新学习CSS后的第三天,学习制作阴影的过程中,发现的问题:设置了box-shadow后展现的阴影: 添加transform:rotate(10deg);后的效果: 查看CodePen例子:阴影效果 ...
- ELK 搭建实战
一, 软件介绍 01,为什么用到ELK? 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大 如何 ...
- easyUI--datagrid 实现按键控制( enter tab 方向键 )
1.表格定义时加上 onClickCell: onClickCell,2.定义列时加入编辑器3.引入 key.js 即可使用 enter 键 或者向下箭头 选中单元格下移 选中单元格上移 tab键 选 ...
- 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统
这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...
- 精选9个值得学习的 HTML5 效果
此文转自:http://www.cnblogs.com/lhb25/p/9-html5-effects.html,仅供本人学习参考,版权归原作者所有! 精选9个值得学习的 HTML5 效果[附源码] ...
- TOJ 1023 Taxi Cab Scheme
Description Running a taxi station is not all that simple. Apart from the obvious demand for a centr ...
- CentOS 6.5 安装MySQL数据库
CentOS 6.5 安装MySQL数据库 [root@seeker~]# yum -y install mysql-server //安装命令 [root@seeker~]# service mys ...
- html结构内容拾忆
文本格式化: <b>This text is bold</b><!--定义粗体文本.--> <strong>This text is strong< ...
- UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息
应用开发中,开发者时常需要获取一些系统.用户信息用于数据统计遥测.问题反馈.用户识别等功能.本文旨在介绍在 Windows UWP 应用中获取一些常用系统.用户信息的方法.示例项目代码可参见 Gith ...
- OGNL,表达式上下文ContextMap
1.OGNL表达式 object graph navigation language:对象图导航语言 存取对象属性:调用对象方法:字段类型转换等. <input type="text& ...