题目描述

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 题解的更多相关文章

  1. 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/ ...

  2. cf437D The Child and Zoo

    D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. Codeforces 437 D. The Child and Zoo 并查集

    题目链接:D. The Child and Zoo 题意: 题意比较难懂,是指给出n个点并给出这些点的权值,再给出m条边.每条边的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么 ...

  4. CF437D(The Child and Zoo)最小生成树

    题目: D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

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

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

  6. 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 ...

  7. Codeforces D - The Child and Zoo

    D - The Child and Zoo 思路: 并查集+贪心 每条边的权值可以用min(a[u],a[v])来表示,然后按边的权值从大到小排序 然后用并查集从大的边开始合并,因为你要合并的这两个联 ...

  8. 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 ...

  9. Codeforces 437D The Child and Zoo(并查集)

    Codeforces 437D The Child and Zoo 题目大意: 有一张连通图,每个点有对应的值.定义从p点走向q点的其中一条路径的花费为途径点的最小值.定义f(p,q)为从点p走向点q ...

随机推荐

  1. SqlSugar ORM框架文档

    http://www.codeisbug.com/Doc/8/1141 SqlSugar入门级教程+实例 (.net core下的)https://www.cnblogs.com/rulasann/p ...

  2. spring依赖版本约束

    <dependencyManagement> <dependencies> <dependency> <groupId>org.springframew ...

  3. git读书笔记以及使用技巧

    [添加文件] git add  把文件修改添加到暂存区    git commit -m '' 把暂存区的所有内容提交到当前分支 [查看历史]    git log 查看提交历史 git log -- ...

  4. git win7 dos下设置代理

    git config --global http.proxy http://username:pwd@my.you.com:port

  5. 【卷土重来之C#学习笔记】(三) 类的基本概念

    1.类的概述   程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并被称为类.   类是一个能存储数据并执行代码的数据结构. 它包含数据成员和函数成员: 数据成员:存储与类或类的实例相关数 ...

  6. 前端测试框架 puppeteer 文档翻译

    puppeteer puppeteer 是一个通过DevTools 协议提供高级API 来控制 chrome,chromium 的 NODE库; puppeteer默认运行在 headless 模式, ...

  7. 理解JavaScript作用域

    这是一篇译文,这里贴上译文地址:http://www.zcfy.cc/article/understanding-scope-in-javascript-8213-scotch-4075.html 这 ...

  8. CSS设计模式之三权分立模式篇 ( 转)

    转自 海玉的博客 市面上我们常常会看到各种各样的设计模式书籍,Java设计模式.C#设计模式.Ruby设计模式等等.在众多的语言设计模式中我唯独找不到关于CSS设计模式的资料,即使在网上找到类似内容, ...

  9. 牛客提高R5 A.同余方程

    题意 题目链接 Sol 设\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数 首先容斥一下,\(ans = solve(r_1, r_2 ...

  10. Drupal theme_hook

    模板语言和主题引擎 用Drupal的行话来说,主题就是一组负责你站点外观的文件.你可以从http://drupal.org/project/Themes下载第 3方主题,或者你可以自己动手创建一个主题 ...