【BZOJ】【P3754】【Tree之最小方差树】【Mst】

来源:互联网 发布:arcgis导出栅格数据 编辑:程序博客网 时间:2024/06/03 23:49

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3754

推了一下方差的式子……然后……什么也没发现T_T

然后看数据范围小到爆

于是我们枚举平均数做最小生成树就可以了

rank成功倒数第一

Code:

#include<bits/stdc++.h>using namespace std;const int maxn=101;struct edge{int u,v,c;double w;bool operator<(edge oth)const{return w<oth.w;};}edges[2001];int fa[maxn];int find(int x){if(fa[x]==x)return x;return fa[x]=find(fa[x]);}int n,m;double abar;double Mst(){double ans=0,res=0;int cnt=0;for(int i=1;i<=n;i++)fa[i]=i;sort(edges+1,edges+1+m);for(int i=1;i<=m;i++){int u=edges[i].u,v=edges[i].v;if(find(u)!=find(v)){fa[find(u)]=find(v);ans+=edges[i].w;res+=edges[i].c;if(++cnt==n-1)break;}}return fabs(res-abar*(n-1))<1?ans:1e10;}double ans=1e10;int mx=0;int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].c),mx=max(mx,edges[i].c);for(int i=0;i<=mx*100;i++){abar=(double)i/100.0;for(int j=1;j<=m;j++)edges[j].w=(double)(edges[j].c-abar)*(edges[j].c-abar);ans=min(ans,Mst());}printf("%.4lf\n",sqrt((double)ans/(n-1)));return 0;}




0 0
原创粉丝点击