算法提高 最小方差生成树  
时间限制:1.0s   内存限制:256.0MB
      
问题描述
给定带权无向图,求出一颗方差最小的生成树。
输入格式
输入多组测试数据。第一行为N,M,依次是点数和边数。接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W。保证图连通。n=m=0标志着测试文件的结束。
输出格式
对于每组数据,输出最小方差,四舍五入到0.01。输出格式按照样例。
样例输入
4 5
1 2 1
2 3 2
3 4 2
4 1 1
2 4 3
4 6
1 2 1
2 3 2
3 4 3
4 1 1
2 4 3
1 3 3
0 0
样例输出
Case 1: 0.22
Case 2: 0.00
数据规模与约定

1<=U,V<=N<=50,N-1<=M<=1000,0<=W<=50。数据不超过5组。

蓝桥杯的测试数据好像有问题。。。

 #include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <map>
#include <cmath>
#include <stack>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#define FOR(i,x,n) for(long i=x;i<n;i++)
#define ll long long int
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define MAX_N 60
#define MAX_M 1005 using namespace std; struct node{
int u,v;
double wPrior;
double wNow;
};
node graph[MAX_M];//储存边
int N,M;//点,边
int a[];//并查集数组 void init(){//并查集数组初始化
FOR(i,,){
a[i]=i;
}
} bool cmp(node a,node b){
return a.wNow<b.wNow;
} int findCaptain(int t){//寻找队长
if(a[t]==t){
return t;
}else{
return a[t]=findCaptain(a[t]);//路径压缩
}
} bool judge(int t1,int t2){//判断是否在一组内
return findCaptain(t1)==findCaptain(t2);
} void unionPoint(int t1,int t2){//合并两点
int tt=findCaptain(t1);
int ttt=findCaptain(t2);
a[tt]=ttt;
} double kruskal(int sum){//kruskal最小生成树
int edgeCount=;
double sum2=;
double sum3=;
double ave=sum*1.0/(N-);
FOR(i,,M){
graph[i].wNow=(graph[i].wPrior-ave)*(graph[i].wPrior-ave);
}
sort(graph,graph+M,cmp);//按边权从小到大排序
FOR(i,,M){
int t1=graph[i].u;
int t2=graph[i].v;
if(!judge(t1,t2)){
unionPoint(t1,t2);
edgeCount++;
sum2+=graph[i].wPrior;
sum3+=graph[i].wNow;
if(edgeCount==N-){
break;
}
}
}
if(sum==(int)sum2){
return sum3;
}else{
return INF*1.0;
}
} int main()
{
//freopen("input1.txt", "r", stdin);
//freopen("data.out", "w", stdout);
double t[];
int caseCount=;
double minVariance=INF*1.0;
while(~scanf("%d %d",&N,&M)&&(N+M)){
FOR(i,,M){
scanf("%d %d %lf",&graph[i].u,&graph[i].v,&graph[i].wPrior);
t[i]=graph[i].wPrior;
}
sort(t,t+M);
double minn=,maxx=;
FOR(i,,N-){//找出可能的最小的average*(n-1)
minn+=t[i];
}
FOR(i,M-N+,M){//找出最大的average*(n-1)
maxx+=t[i];
}
minVariance=INF*1.0;
FOR(i,minn,maxx+){
init();
double ans=kruskal(i);
minVariance=min(minVariance,ans);
}
printf("Case %d: %.2f\n",++caseCount,minVariance/(N-)); } //fclose(stdin);
//fclose(stdout);
return ;
}

算法提高 最小方差生成树(Kruskal)_模板的更多相关文章

  1. 算法笔记_164:算法提高 最小方差生成树(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...

  2. Java实现 蓝桥杯 算法提高最小方差生成树

    1 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n ...

  3. [loj2469]最小方差生成树

    2018年论文题 约定:令点集$V=[1,n]$.边集$E=[1,m]$,记$m$条边依次为$e_{i}=(x_{i},y_{i},c_{i})$(其中$1\le i\le m$),将其按照$c_{i ...

  4. Java实现 蓝桥杯VIP 算法提高 最小乘积(提高型)

    算法提高 最小乘积(提高型) 时间限制:1.0s 内存限制:512.0MB 问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最 ...

  5. 【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)

    今天考试的时候果然题目太难于是我就放弃了……转而学习了一下最小乘积生成树. 最小乘积生成树定义: (摘自网上一篇博文). 我们主要解决的问题就是当k = 2时,如何获得最小的权值乘积.我们注意到一张图 ...

  6. bzoj 3754: Tree之最小方差树 模拟退火+随机三分

    题目大意: 求最小方差生成树.N<=100,M<=2000,Ci<=100 题解: 首先我们知道这么一个东西: 一些数和另一个数的差的平方之和的最小值在这个数是这些数的平均值时取得 ...

  7. [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树

    [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...

  8. 算法提高 金属采集_树形dp

    算法提高 金属采集   时间限制:1.0s   内存限制:256.0MB        问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连 ...

  9. UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)

    题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...

随机推荐

  1. Python的pandas

    pandas 是python中很重要的组件,网上关于pandas 的文章也很多,比如Python科学计算之Pandas 和 Python数据分析入门 Pandas基于两种数据类型:series与dat ...

  2. vue-cli使用sockjs即时通信

    基于webSocket通信的库主要有 socket.io,SockJS,这次用的是 SockJS. 这里我们使用sockjs-client.stomjs这两个模块,要实现webSocket通信,需要后 ...

  3. JSP简单练习-猜字母游戏

    <!-- guessCharExample.jsp --> <%@ page contentType="text/html; charset=gb2312" %& ...

  4. html5学习笔记3——高级特性

    一:Web存储 数据以 键/值 对存在, web网页的数据只允许该网页访问使用. web存储有两种: localStorage - 没有时间限制的数据存储,存于浏览器缓存 sessionStorage ...

  5. 每天一个linux命令(13):less命令

    1.命令简介 less(less)  命令可以对文件或其它输出进行分页显示,与moe命令相似,但是比more命令要强大许多.应该说是linux正统查看文件内容的工具. 2.用法 less [选项].. ...

  6. 查看SQL Server的版本及License

    select @@VERSION Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyri ...

  7. 基于R语言的时间序列指数模型

    时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...

  8. C# WebAPI学习

    WebApi是微软在VS2012 MVC4版本中绑定发行的,WebApi是完全基于Restful标准的框架.RestFul: (英文:Representational State Transfer,简 ...

  9. 小型互联网公司的IT系统建设思路

    ​​最近一些想创业的一帮兄弟来问我,准备借助互联网的翅膀,做某某事情,并想尽快的做出一个系统平台. 我给的思路,分6个步骤: 需求-> 灵感设计 ->实现 ->迭代改进 ->成 ...

  10. Deep Dive into Spark SQL’s Catalyst Optimizer(中英双语)

    文章标题 Deep Dive into Spark SQL’s Catalyst Optimizer 作者介绍 Michael Armbrust, Yin Huai, Cheng Liang, Rey ...