[Codeforces 437D The Child and Zoo](http://codeforces.com/problemset/problem/437/D)
题目大意:
有一张连通图,每个点有对应的值。定义从p点走向q点的其中一条路径的花费为途径点的最小值。定义f(p,q)为从点p走向点q的所有路径中的最大花费。累加每一对p,q的f(p,q),并求平均值。
乍一看以为是对图的搜索,但搜索求和的过程肯定会超时。这一题巧妙的用到了[并查集](http://www.cnblogs.com/orangee/p/8686470.html),因此做简单记录。
思路:
将边的权值定义为两点间的较小值,对边进行降序排序。排序后将每条边的两点进行并查集维护,由于排了序,所以可以保证两个点所属集合合并时,num[u]、num[w]、v三者的乘积得到是两个集合中的点两两组合的f(u,w)的总和(因为此时两集合中任意各取一点都满足所走路径的花费为v(当前边的权值),且是这两点所有路径中花费最大的),这也是个人感觉该解法的巧妙之处(其中num[i]表示根为i的集合的大小)。总之感觉这题对问题的转化真的很有趣。
PS:要注意累加时中间过程可能溢出,因此可以强制转化其中一个数为double,从而使其他数跟着类型提升,防止溢出。
代码:
```C++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef map M;
typedef queue Q;
typedef vector V;
typedef pair P;
const int maxn=5*100000;
int a[maxn],p[maxn],num[maxn];//num[i]表示根为i的集合的大小
struct edge
{
int u,w,v;
};
bool cmp(const edge& a,const edge& b)
{
return a.v>b.v;
}
edge e[maxn];
double sum=0;
void init(int n)
{
for (int i=0;i>n>>m;
//输入
for (i=1;i</font>

最新文章

  1. iOS引入JavaScriptCore引擎框架(二)
  2. 洛谷P1156 垃圾陷阱
  3. Andoid 利用ndk-stack定位崩溃代码
  4. demo_04绘制三角形
  5. 谈&quot;http get和post的区别&quot;
  6. node.js动态调试
  7. OCA读书笔记(12) - 数据库维护
  8. Theano学习笔记(一)——代数
  9. SDOI2016 R1 解题报告 bzoj4513~bzoj4518
  10. JSP中include指令和include动作区别
  11. Bzoj4555: [Tjoi2016&amp;Heoi2016]求和
  12. Linux 常用分区方式
  13. asp.net重要小知识
  14. Django中的缓存(内存,文件,redis)
  15. Ubuntu 14.04 vi 退格键不能删除字符
  16. 手动安装sublime插件babel-sublime
  17. 【C#】List&lt;T&gt;对象的深复制
  18. 64. Minimum Path Sum (Graph; DP)
  19. 经典傅里叶算法小集合 附完整c代码
  20. 封印解除:如何在Win10家庭版中启用组策略

热门文章

  1. Winfrom 定时锁屏
  2. 【原创】大叔问题定位分享(33)oozie提交任务报错ArithmeticException: / by zero
  3. 服务端相关知识学习(六)Zookeeper client
  4. vue 登录 + 记住密码 + 密码加密解密
  5. 1 c# 获取当前正在运行的类的程序集
  6. 乐观锁之版本号机制和CAS
  7. oracle中行转列操作
  8. centos7中的网卡名称相关知识
  9. SQL 语句 连接
  10. 十四,K8s集群网络flannel及canal策略