思路:
枚举平均数,直接计算
c o d e code code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n, m, fa[1010];
struct node
{
int x, y;
double w, fang;
}b[400100];
double maxn, a[10100], ans=100000000.0;
bool cmp(node x, node y)
{
return x.fang<y.fang;
}
int find_(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find_(fa[x]);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++)
scanf("%d%d%lf", &b[i].x, &b[i].y, &b[i].w), maxn=max(maxn, b[i].w);
for(double i=0.0; i<=maxn; i+=0.1)
{
for(int j=1; j<=m; j++)
b[j].fang=(b[j].w-i)*(b[j].w-i);
sort(b+1, b+1+m, cmp);
for(int j=1; j<=n; j++)
fa[j]=j;
int k=0;
for(int j=1; j<=m; j++)
{
int fx=find_(b[j].x), fy=find_(b[j].y);
if(fx!=fy)
fa[fx]=fy, a[++k]=b[j].w;
if(k==n-1)
break;
}
double p=0;
for(int j=1; j<=k; j++)
p=p+a[j];
p=p/(k*1.0);
double sum=0;
for(int j=1; j<=k; j++)
sum+=(a[j]-p)*(a[j]-p);
ans=min(ans, sqrt(sum/(k*1.0)));
}
printf("%.4lf", ans);
return 0;
}