发现,若使方差最小,则使Σ(wi-平均数)2最小即可。
因为权值的范围很小,所以我们可以枚举这个平均数,每次把边权赋成(wi-平均数)2,做kruscal。
但是,我们怎么知道枚举出来的平均数是不是恰好是我们的这n-1条边的呢? 就在更新答案的时候加个特判就行了。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 #define N 101 7 #define M 2001 8 typedef double db; 9 int fa[N],a[M],n,m,minv,maxv,rank[N];10 db ans=999999999999999999999999999999.0;11 bool cmp(const int &a,const int &b){ return a>b;}12 struct Edge{ int u,v,w;db fw;void Read(){scanf("%d%d%d",&u,&v,&w);}}edges[M];13 bool operator < (const Edge &a,const Edge &b){ return a.fw