bzoj3754 Tree之最小方差树(枚举+Kruskal)
2018-03-30 10:56
246 查看
求最小方差树。只好枚举平均数。求出可能的最小边权和和最大边权和,然后枚举边权和,做Kruskal更新答案。因为f(x)=∑i=1n(ai−x)2,当x=a¯时f(x)取得最小值,所以如果当前方案不合法也没关系,一定会在合法时更新为更小的。复杂度O(n∗C∗mlogm)
其实我觉得这样复杂度不太科学(逃 还是0.25为间距枚举平均数比较靠谱O(4∗C∗mlogm)
其实我觉得这样复杂度不太科学(逃 还是0.25为间距枚举平均数比较靠谱O(4∗C∗mlogm)
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 110 #define M 2010 inline char gc(){ static char buf[1<<16],*S,*T; if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(S==T) return EOF;} return *S++; } inline int read(){ int x=0,f=1;char ch=gc(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc(); return x*f; } int n,m,fa ;double ans=inf; struct edge{ int x,y,c;double w; friend bool operator<(edge a,edge b){return a.w<b.w;} }e[M]; inline double pow2(double x){return x*x;} inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} inline double Kruskal(){ sort(e+1,e+m+1);for(int i=1;i<=n;++i) fa[i]=i; int tot=0;double res=0; for(int i=1;i<=m;++i){ int xx=find(e[i].x),yy=find(e[i].y); if(xx==yy) continue;fa[xx]=yy;++tot;res+=e[i].w;if(tot==n-1) break; }return res; } int main(){ // freopen("a.in","r",stdin); n=read();m=read(); for(int i=1;i<=m;++i) e[i].x=read(),e[i].y=read(),e[i].c=read(); for(int i=1;i<=m;++i) e[i].w=e[i].c;int Min=Kruskal(); for(int i=1;i<=m;++i) e[i].w=-e[i].c;int Max=-Kruskal(); for(int j=Min;j<=Max;++j){ double ea=j*1.0/(n-1); for(int i=1;i<=m;++i) e[i].w=pow2(e[i].c-ea); ans=min(ans,Kruskal()); }printf("%.4lf\n",sqrt(ans/(n-1))); return 0; }
相关文章推荐
- 【枚举】【最小生成树】【kruscal】bzoj3754 Tree之最小方差树
- 【BZOJ 3754】Tree之最小方差树
- BZOJ 3754 Tree之最小方差树 MST
- BZOJ 3754 Tree之最小方差树 解题报告
- bzoj 3754: Tree之最小方差树 模拟退火+随机三分
- BZOJ 3754: Tree之最小方差树
- 【BZOJ3754】Tree之最小方差树
- bzoj3754: Tree之最小方差树
- [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树
- BZOJ 3754 Tree之最小方差树
- Bzoj3754 Tree之最小方差树 MST
- 【BZOJ 3754】【JZOJ 3410]】Tree之最小方差树 -
- [bzoj3754]Tree之最小方差树【暴力】【MST】
- 【BZOJ 3754】: Tree之最小方差树
- [BZOJ3754]Tree之最小方差树
- [bzoj 1016] [JSOI2008]最小生成树计数:Kruskal,枚举
- 【bzoj3754】Tree之最小方差树 最小生成树
- BZOJ 2654 tree 详解(最小生成树 kruskal 二分)
- 【BZOJ1016】【JSOI2008】最小生成树计数 & 【BZOJ1543】生成树计数 (kruskal+matrix_tree定理)
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)