[BZOJ3754]Tree之最小方差树
2016-06-14 07:19
295 查看
3754: Tree之最小方差树
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 402 Solved: 152
[Submit][Status][Discuss]
Description
Wayne在玩儿一个很有趣的游戏。在游戏中,Wayne建造了N个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M对城市间能修公路,即有若干三元组 (Ui,Vi,Ci)表示Ui和Vi间有一条长度为Ci的双向道路。当然,游戏保证了,若所有道路都修建,那么任意两城市可以互相到达。Wayne拥有恰好N-1支修建队,每支队伍能且仅能修一条道路。当然,修建长度越大,修建的劳累度也越高,游戏设定是修建长度为C的公路就会有C的劳累度。当所有的队伍完工后,整个城市群必须连通,而这些修建队伍们会看看其他队伍的劳累情况,若劳累情况差异过大,可能就会引发骚动,不利于社会和谐发展。Wayne对这个问题非常头疼,于是他想知道,这N1支队伍劳累度的标准差最小能有多少。标准差的定为:设有N个数,分别为ai,它们的平均数为
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define N 105 #define M 2010 #define sqr(x) ((x)*(x)) using namespace std; int n,m,tot,f ;double ans=1e9; int find(int x){return f[x]==x?x:f[x]=find(f[x]);} struct edge{int x,y,c;double w;}e[M]; inline bool operator<(edge x,edge y){return x.w<y.w;} double solve() { for(int i=1;i<=n;i++)f[i]=i; int tot=0;double sum=0; for(int i=1;tot!=n-1;i++) { int fx=find(e[i].x),fy=find(e[i].y); if(fx==fy)continue; tot++; f[fx]=fy; sum+=e[i].w; } return sum; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].c),e[i].w=e[i].c; int Min,Max; sort(e+1,e+m+1); Min=solve(); reverse(e+1,e+m+1); Max=solve(); for(int i=Min;i<=Max;i++) { double ave=i*1.0/(n-1); for(int j=1;j<=m;j++) e[j].w=sqr(e[j].c-ave); sort(e+1,e+m+1); ans=min(ans,solve()); } printf("%.4lf\n",sqrt(ans/(n-1))); }
View Code
相关文章推荐
- 第二章指南(4.2)添加 Controller
- DotNet Core 介绍
- 精通Spark集群搭建与测试
- 【MyBatis学习09】高级映射之一对多查询
- 继承与派生的——学生信息的储存
- 【C#】1.3 WPF应用程序学习要点
- iOS程序灵魂之性能优化
- 【C#】1.2 控制台应用程序学习要点
- 116. Populating Next Right Pointers in Each Node
- 2.open函数的flag详解
- 【C#】1.1 第1章学习要点
- 全新的手势,侧滑返回、全局右滑返回都OUT啦!
- 情绪
- Remove Duplicates from Sorted Array II
- 9.6 文件-文件的随机访问
- 9.5 文件-文件的读/写
- 9.4 文件-文件的打开与关闭
- 9.3 标准设备的输入/输出
- 9.2 输入输出的格式控制
- 9.1 C++的基本流类体系