BZOJ 3754 Tree之最小方差树
枚举平均数。
mdzz编译器。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxv 100500
#define maxe 200500
using namespace std;
int n,m,l=,r=,father[maxv],rank[maxv];
double ans=999999999999999999999999999999.0;
struct edge
{
int u,v,w;
double val;
}e[maxe];
bool cmp1(edge x,edge y)
{
return x.w<y.w;
}
bool operator < (const edge &a,const edge &b){return a.val<b.val;}
int getfather(int x)
{
if (father[x]!=x)
father[x]=getfather(father[x]);
return father[x];
}
void unionn(const int u,const int v)
{
if(rank[u]<rank[v]) father[u]=v;
else
{
father[v]=u;
if(rank[u]==rank[v]) ++rank[u];
}
}
double sqr(const double &x){return x*x;}
void kruskal(const int &x)
{
int sum1=,cnt=;
double sum2=,ww=(double)x/(double)(n-);
for (int i=;i<=n;i++) father[i]=i;
memset(rank,,sizeof(rank));
for (int i=;i<=m;i++)
e[i].val=sqr(e[i].w-ww);
sort(e+,e+m+);
for(int i=;i<=m;i++)
{
int f1=getfather(e[i].u),f2=getfather(e[i].v);
if(f1!=f2)
{
unionn(f1,f2);
sum1+=e[i].w;
sum2+=e[i].val;
if((++cnt)==n-) break;
}
}
if (sum1==x)
ans=min(ans,sum2);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+,e+m+,cmp1);
for (int i=;i<=n-;i++) l+=e[i].w;
for (int i=m-n+;i<=m;i++) r+=e[i].w;
for (int i=l;i<=r;i++)
kruskal(i);
printf("%.4f\n",sqrt(ans/(double)(n-)));
return ;
}
BZOJ 3754 Tree之最小方差树的更多相关文章
- bzoj 3754: Tree之最小方差树 模拟退火+随机三分
题目大意: 求最小方差生成树.N<=100,M<=2000,Ci<=100 题解: 首先我们知道这么一个东西: 一些数和另一个数的差的平方之和的最小值在这个数是这些数的平均值时取得 ...
- BZOJ 3754 Tree之最小方差树 MST
Description Wayne 在玩儿一个很有趣的游戏.在游戏中,Wayne 建造了N 个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M 对城 ...
- [BZOJ3754]Tree之最小方差树
3754: Tree之最小方差树 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 402 Solved: 152[Submit][Status][Di ...
- [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树
[BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...
- 【bzoj3754】Tree之最小方差树 最小生成树
题目描述 给出一张无向图,求它的一棵生成树,使得选出的所有边的方差最小.输出这个最小方差. 输入 第一行两个正整数N,M 接下来M行,每行三个正整数Ui,Vi,Ci N<=100,M<=2 ...
- 【BZOJ 3754】Tree之最小方差树
http://www.lydsy.com/JudgeOnline/problem.php?id=3754 核心思想:暴力枚举所有可能的平均数,对每个平均数排序后Kruskal. 正确的答案一定是最小的 ...
- 【BZOJ 3754】: Tree之最小方差树
题目链接: TP 题解: 都是骗子233,我还以为是什么神奇的算法. 由于边权的范围很小,最小生成树和最大生成树之间的总和差不会太大,所以可以枚举边权和,再直接根据方差建最小生成树,每次更新答案即可. ...
- 【枚举】【最小生成树】【kruscal】bzoj3754 Tree之最小方差树
发现,若使方差最小,则使Σ(wi-平均数)2最小即可. 因为权值的范围很小,所以我们可以枚举这个平均数,每次把边权赋成(wi-平均数)2,做kruscal. 但是,我们怎么知道枚举出来的平均数是不是恰 ...
- bzoj3754 Tree之最小方差树 最小生成树+推性质
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3754 题解 感觉这个思路挺神仙的. 后悔没有好好观察题目的数据范围,一直把 \(n\) 和 \ ...
随机推荐
- App自适应
http://blog.csdn.net/newjueqi/article/details/42779221
- ==和equals的区别
== :是判断两个变量或实例是不是指向同一个内存空间equals :是判断两个变量或实例所指向的内存空间的值是不是相同 结论:欲比较栈中数据是否相等,请用= =:欲比较堆中数据是否相等,请用equal ...
- python爬煎蛋妹子图
# python3 # jiandan meizi tu import urllib import urllib.request as req import os import time import ...
- 李洪强iOS开发之OC点语法和变量作用域
OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Per ...
- Arraylist和Vector的区别与HashMap和Hashtable的区别
1.ArrayList和HashMap都是线程异步的,所以它们的特点是效率高,但是安全性低: 2.Vector和Hashtable都是线程同步的,所以它们的特点是效率低,但是安全性高.
- Spring框架学习之第7节
配置Bean的细节 ☞尽量使用scope=”singleton”,不要使用prototype,因为这样对我们的性能影响较大 ②如何给集合类型注入值 Java中主要的map,set,list / 数组 ...
- PHP 对象和数组互相转换
最简单的:$array = (array)$object; 但是, 如果对象的属性也是个对象的话, 就转换不了了, 就是说PHP的强制类型转换不能把对象属性中的对象转换成数组的下一个维度的数组, 刚刚 ...
- OpenMp之false sharing
关于false sharing的文章,网上一大堆了,不过觉得都不太系统,那么下面着重系统说明一下. 先看看外国佬下的定义: In symmetric multiprocessor (SMP) syst ...
- centos6.5 中文
之前在网上查了不少资料,很多网友在网上都说,在shell命令下输入: # vi /etc/sysconfig/i18n 然后修改LANG="en_US.UTF-8" ...
- file的这几个取得path的方法各有不同,下边说说详细的区别
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...