传送门: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;
}