zoukankan      html  css  js  c++  java
  • bzoj3754: Tree之最小方差树

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

    思路:首先我们考虑枚举平均数,以每条边和平均数的差的平方作为新边权

    但平均数是不能直接枚举的

    我们把边排好序,就会发现,对于两个相邻的边权a,b,和ab的平均数v

    以区间(a,v)的任意一个值为预估平均数,我们都会得到相同的一个生成树

    同样,以区间(v,b)的任意一个值为预估平均数,我们都会得到相同的一个生成树

    所以我们只要枚举完这些区间,就可以跑出所有可能的生成树,分别计算它们的真实标准差,取小即可

    因为这题边权是整数,所以以0.25为间隔枚举平均数可过


    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    const int maxn=505,maxm=10010;
    using namespace std;
    struct Edge{int x,y,v;double w;}E[maxm];
    int n,m,fa[maxn],cnt;double ans=1e9,w[2000010];bool in[maxm];
    bool cmp1(Edge a,Edge b){return a.v<b.v;}
    bool cmp2(Edge a,Edge b){return a.w<b.w;}
    int getfa(int x){return x==fa[x]?x:fa[x]=getfa(fa[x]);}
    double sqr(double x){return x*x;}
    double kruskal(double mid){
    	for (int i=1;i<=n;i++) fa[i]=i;
    	for (int i=1;i<=m;i++) E[i].w=sqr(E[i].v-mid),in[i]=0;
    	sort(E+1,E+1+m,cmp2);int num=0;double len=0.0;
    	for (int i=1;i<=m&&num<n-1;i++){
    		int x=E[i].x,y=E[i].y;
    		if (getfa(x)==getfa(y)) continue;
    		num++,fa[getfa(x)]=getfa(y),len+=E[i].v,in[i]=1;
    	}
    	double res=0.0,aver=len/(n-1);
    	for (int i=1;i<=m;i++) if (in[i]) res+=sqr(E[i].v-aver);
    	return sqrt(res/(n-1));
    }
    
    int main(){
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=m;i++) scanf("%d%d%d",&E[i].x,&E[i].y,&E[i].v);
    	sort(E+1,E+1+m,cmp1);
    	for (int i=1;i<=m;i++)
    		for (int j=i;j<=m;j++)
    			w[++cnt]=(E[i].v+E[j].v)/2.0;
    	sort(w+1,w+1+cnt),cnt=unique(w+1,w+1+cnt)-w-1;
    	ans=min(ans,kruskal(w[1]/2.0)),ans=min(ans,kruskal(w[cnt]+1.0));
    	for (int i=1;i<cnt;i++) ans=min(ans,kruskal((w[i]+w[i+1])/2.0));
    	printf("%.4lf
    ",ans);
    	return 0;
    }
    
    /*
    3 3
    1 2 1
    2 3 2
    3 1 3
    */





  • 相关阅读:
    java软件设计模式只单例设计模式
    IOS疯狂基础之观察者模式
    IOS之UIColor
    UITableView与UITableViewCell
    UILabel的各种属性和方法
    iOS TextField
    【IPHONE开发-OBJECTC入门学习】对象的归档和解归档
    【IPHONE开发-OBJECTC入门学习】复制对象,深浅复制
    【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件
    虚拟机VMware 9安装苹果MAC OSX 10.8图文教程
  • 原文地址:https://www.cnblogs.com/thythy/p/5493472.html
Copyright © 2011-2022 走看看