【BZOJ 3754】【JZOJ 3410]】Tree之最小方差树 -
2016-06-11 18:58
375 查看
Description
Wayne 在玩儿一个很有趣的游戏。在游戏中,Wayne 建造了N 个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M 对城市间能修公路,即有若干三元组(Ui, Vi,Ci) 表示Ui 和Vi 间有一条长度为Ci 的双向道路。当然,游戏保证了,若所有道路都修建,那么任意两城市可以互相到达。Wayne 拥有恰好N - 1 支修建队,每支队伍能且仅能修一条道路。当然,修建长度越大,修建的劳累度也越高,游戏设定是修建长度为C 的公路就会有C 的劳累度。当所有的队伍完工后,整个城市群必须连通,而这些修建队伍们会看看其他队伍的劳累情况,若劳累情况差异过大,可能就会引发骚动,不利于社会和谐发展。Wayne 对这个问题非常头疼,于是他想知道,这N - 1 支队伍劳累度的标准差最小能有多少。
Solution
这题的解法绝对是我见过的最鬼畜的之一,根本没有往这个方向想过QAQ;因为方差要用到平均数,我们就先枚举一个参考平均数(精确到0.1即可),计算出每个边权于它的差,再做一遍最小生成树,生成了n-1条边后在计算真正的平均值,就可以得出答案了,
复杂度:O(100∗10∗mlog(m));
小心精度问题!
Code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define sqr(a) ((a)*(a)) using namespace std; typedef double db; const int N=150,M=2500,maxlongint=2147483640; int read(int &n) { char ch=' ';int q=0,w=1; for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar()); if(ch=='-')w=-1,ch=getchar(); for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n; } int m,n,S; db ans; int g ; struct qqww{int x,y,s;db z;}B[M],b[M]; bool PX(qqww a,qqww b){return a.z<b.z;} db min(db a,db b){return a<b?a:b;} int gf(int q){return g[q]=(g[q]==q?q:gf(g[q]));} int main() { int mx=0,mi=100,q; read(n),read(m); fo(i,1,m) read(B[i].x),read(B[i].y),B[i].z=read(q),B[i].s=i,mx=max(mx,q),mi=min(mi,q); n--;ans=maxlongint; for(db av=mi;av<mx;av+=0.1) { fo(j,1,m)b[j]=B[j],b[j].z=sqr(B[j].z-av); sort(b+1,b+1+m,PX); fo(j,1,n+1)g[j]=j; int q=n,sum=0,SUM=0; for(int j=1;q&&j<=m;j++) { int x=gf(b[j].x),y=gf(b[j].y); if(x!=y) { g[x]=y;q--; SUM+=sqr(B[b[j].s].z),sum+=B[b[j].s].z; } } if(!q) { db av=1.0*sum/n; ans=min(ans,SUM-2*av*sum+sqr(av)*n); } } printf("%.4lf",sqrt(1.0*ans/n)); return 0; }
相关文章推荐
- hdu5187 zhx's contest题解(快速幂快速积)
- 61. Rotate List
- PDO预处理防sql注入
- 【51CTO学院三周年】学业有成啦
- Windows下体验Linux Ubuntu系统&&安装JDK,Android SDK,Android Studio
- 从零开始山寨Caffe·壹:仰望星空与脚踏实地
- Asp.net Session 与Cookie的应用
- java调用Oracle分页存储过程
- 创建Oracle数据库
- 互联网协议入门
- android system权限获取
- spring 自动装配
- 从零开始山寨Caffe·零:必先利其器
- C# ACCESS数据库操作类
- 永不过时的自定义AlertView
- 使用PHPExcel导出文件
- 文章标题
- 省市县联动 php处理 生成js文件 并且jquery 调用
- JavaAPI之Type接口
- 【Linux】简单实现进度条