标签:ac 平均值 noip 方差 int ww 枚举 ave 3286
给定带权无向图,求出一颗方差最小的生成树。
_________________________________________________
方差就是各个数的平均值与各个数的差的平方的和的平均值。
sum((a_i-ave)^2)/n
多组数据。
枚举是不现实的。但是不枚举如何知道他们的平均值?
把所有的边排序,取出最小的n-1条和最大的n-1条分别求和,为mn和mx。那么ave*(n-1)一定在这个范围内。
枚举这个值(也就是n-1条边的和),除以n-1就得到了平均值,用图中所有的变用这个平均值求差值的平方作为变得新权ww。用ww求新的最小生成树。
开始,怀疑过:有些和是不会产生的,那么他们产生的方差会不会影响最终结果。
假设,和为s时产生了平均数ave,用它选了相应最小的n-1条树边并产生的对应的方差。但是,这个和s并不会产生,当然ave也就不会产生。
我们假设,对应的n-1条边真正产生的平均值是AVE,那么很明显AVE要比ave也好,当枚举到对应的值时自然会得到更好的解!
_________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=55;
4 const int maxm=1010;
5 struct edge
6 {
7 int u,v;
8 double w,ww;
9 }e[maxm];
10 int n,m,mn,mx;
11 bool cmp(edge a,edge b)
12 {
13 return a.w<b.w;
14 }
15 bool cmp2(edge a,edge b)
16 {
17 return a.ww<b.ww;
18 }
19 double ans;
20 int cas;
21 int f[maxn];
22 int find(int x)
23 {
24 return f[x]==x?x:f[x]=find(f[x]);
25 }
26 void join(int x,int y)
27 {
28 x=find(x);y=find(y);
29 if(rand()%2)f[x]=y;
30 else f[y]=x;
31 }
32 int main()
33 {
34 while(scanf("%d%d",&n,&m)==2 && n &&m)
35 {
36 cas++;
37 for(int i=1;i<=m;++i)scanf("%d%d%lf",&e[i].u,&e[i].v,&e[i].w);
38 sort(e+1,e+1+m,cmp);
39 mn=mx=0;
40 ans=100000000000;
41 for(int i=1;i<n;++i)mn+=e[i].w;
42 for(int i=m;i>m-n+1;--i)mx+=e[i].w;
43 for(int i=mn;i<=mx;++i)
44 {
45 double tp=0;
46 double pj=1.0*i/(n-1);
47 for(int j=1;j<=m;++j)e[j].ww=(e[j].w-pj)*(e[j].w-pj);
48 for(int j=1;j<=n;++j)f[j]=j;
49 sort(e+1,e+1+m,cmp2);
50 int js=0;
51 for(int j=1;j<=m;++j)
52 {
53 if(find(e[j].u)!=find(e[j].v))
54 {
55 join(e[j].u,e[j].v);
56 js++;
57 tp+=e[j].ww;
58 if(js==n-1)break;
59 }
60 }
61 ans=min(ans,tp);
62 }
63 printf("Case %d: %.2lf\n",cas,ans/(n-1));
64 }
65 return 0;
66 }
View Code
标签:ac,平均值,noip,方差,int,ww,枚举,ave,3286 来源: https://www.cnblogs.com/gryzy/p/14514027.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
