• bzoj3754: Tree之最小方差树


    Description

    Wayne在玩儿一个很有趣的游戏。在游戏中,Wayne建造了N个城市,现在他想在这些城市间修一些公路,当然并不是任意两个城市间都能修,为了道路系统的美观,一共只有M对城市间能修公路,即有若干三元组 (Ui,Vi,Ci)表示Ui和Vi间有一条长度为Ci的双向道路。当然,游戏保证了,若所有道路都修建,那么任意两城市可以互相到达。Wayne拥有恰好N-1支修建队,每支队伍能且仅能修一条道路。当然,修建长度越大,修建的劳累度也越高,游戏设定是修建长度为C的公路就会有C的劳累度。当所有的队伍完工后,整个城市群必须连通,而这些修建队伍们会看看其他队伍的劳累情况,若劳累情况差异过大,可能就会引发骚动,不利于社会和谐发展。Wayne对这个问题非常头疼,于是他想知道,这N1支队伍劳累度的标准差最小能有多少。
    标准差的定为:设有N个数,分别为ai,它们的平均数为 ,那么标准差就是
     
     

    Input

    第一行两个正整数N,M
    接下来M行,每行三个正整数Ui,Vi,Ci
     

    Output

    输出最小的标准差,保留四位小数。

    Sample Input

    3
    1 2 1
    2 3 2
    3 1 3

    Sample Output

    0.5000

    HINT

    N<=100,M<=2000,Ci<=100

    题解:

    Orz thy http://blog.csdn.net/thy_asdf/article/details/50514711

    code:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define maxn 105
     7 #define maxm 2005
     8 #define sqr(x) ((x)*(x))
     9 using namespace std;
    10 char ch;
    11 bool ok;
    12 void read(int &x){
    13     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
    14     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
    15     if (ok) x=-x;
    16 }
    17 struct Edge{
    18     int u,v,c;
    19     double w;
    20 }edge[maxm];
    21 bool cmp(Edge a,Edge b){return a.w<b.w;}
    22 int n,m,tot;
    23 double w[maxm*maxm],ans=1E30;
    24 int fa[maxn];
    25 int find(int x){return x==fa[x]?fa[x]:fa[x]=find(fa[x]);}
    26 double kruskal(double mid){
    27     for (int i=1;i<=n;i++) fa[i]=i;
    28     for (int i=1;i<=m;i++) edge[i].w=sqr(edge[i].c-mid);
    29     sort(edge+1,edge+m+1,cmp);
    30     double ans=0,ave=0;
    31     for (int i=1,cnt=0;i<=m&&cnt<n;i++) if (find(edge[i].u)!=find(edge[i].v))
    32         fa[find(edge[i].u)]=find(edge[i].v),ans+=sqr(edge[i].c),ave+=edge[i].c;
    33     ans/=n-1,ave/=n-1,ans=ans-sqr(ave);
    34     return ans;
    35 }
    36 int main(){
    37     read(n),read(m);
    38     for (int i=1;i<=m;i++) read(edge[i].u),read(edge[i].v),read(edge[i].c);
    39     for (int i=1;i<=m;i++) for (int j=1;j<=m;j++) w[++tot]=(edge[i].c+edge[j].c)/2.0;
    40     sort(w+1,w+tot+1),tot=unique(w+1,w+tot+1)-w-1;
    41     for (int i=2;i<=tot;i++) ans=min(ans,kruskal((w[i-1]+w[i])/2.0));
    42     printf("%.4lf
    ",sqrt(ans));
    43     return 0;
    44 }
  • 相关阅读:
    [你必须知道的.NET]第三十四回,object成员,不见了!
    [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>点滴
    [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二
    [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
    C#中String跟string的“区别”
    [你必须知道的.NET]第三十回:.NET十年(下)
    log4j.properties 详解与配置步骤
    Linux下进程数量的限制pid_max的配置方法
    解决OutOfMemoryError: unable to create new native thread问题
    ORA-12518: TNS:listener could not hand off client connection
  • 原文地址:https://www.cnblogs.com/chenyushuo/p/5129307.html
Copyright © 2020-2023  润新知