算法提高 最小方差生成树(Kruskal)_模板
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 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)_模板的更多相关文章
- 算法笔记_164:算法提高 最小方差生成树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...
- Java实现 蓝桥杯 算法提高最小方差生成树
1 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W.保证图连通.n ...
- [loj2469]最小方差生成树
2018年论文题 约定:令点集$V=[1,n]$.边集$E=[1,m]$,记$m$条边依次为$e_{i}=(x_{i},y_{i},c_{i})$(其中$1\le i\le m$),将其按照$c_{i ...
- Java实现 蓝桥杯VIP 算法提高 最小乘积(提高型)
算法提高 最小乘积(提高型) 时间限制:1.0s 内存限制:512.0MB 问题描述 给两组数,各n个. 请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小.要求程序输出这个最 ...
- 【算法】最小乘积生成树 & 最小乘积匹配 (HNOI2014画框)
今天考试的时候果然题目太难于是我就放弃了……转而学习了一下最小乘积生成树. 最小乘积生成树定义: (摘自网上一篇博文). 我们主要解决的问题就是当k = 2时,如何获得最小的权值乘积.我们注意到一张图 ...
- bzoj 3754: Tree之最小方差树 模拟退火+随机三分
题目大意: 求最小方差生成树.N<=100,M<=2000,Ci<=100 题解: 首先我们知道这么一个东西: 一些数和另一个数的差的平方之和的最小值在这个数是这些数的平均值时取得 ...
- [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树
[BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...
- 算法提高 金属采集_树形dp
算法提高 金属采集 时间限制:1.0s 内存限制:256.0MB 问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了.一些节点之间有道路相连 ...
- UVA 11865 Stream My Contest 组网 (朱刘算法,有向生成树,树形图)
题意: 给n个点编号为0~n-1,0号点为根,给m条边(含自环,重边),每条边有个代价,也有带宽.给定c,问代价不超过c,树形图的最小带宽的最大值能达到多少? 思路: 点数才60,而带宽范围也不大,可 ...
随机推荐
- C# Draw multiple Lines
I would make a Line class having start and end point of the line in struct Point and make list of th ...
- iOS10使用SecKeyCreateWithData读取公钥私钥
在使用openssl命令生成RSA公钥私钥以后,当后端人员把密钥的字符串发给你: 首先要问清公钥私钥的密钥格式(PKCS1,PKCS8),密钥位数(1024,2048),然后在iOS10以后,使用苹果 ...
- grid - 隐式地命名网格区域名称
通常可以将网格线命名成任何你想命名的名称,如果网格线名称添加-start和-end的后缀,其实也隐式的创建一个网格区域,可以用来设置网格项目的位置. 在这个示例中,行和列都具有inner-start和 ...
- UseSwagger
if [ "$UseSwagger" != "true" ]; then sed -i "s/\"UseSwagger\": tr ...
- OpenWrt 对外网开放vsftp服务和samba服务
对WAN开放vsFTP OpenWrt默认启动了vsftp服务, 在Luci上没找到配置界面, 但是后台是有这个服务的, 如果在Openwrt的lan下, 可以直接使用FileZilla之类的客户端连 ...
- 通过itools安装ipa时,如果装不上提示"Mismatche...onIdentifierEntitlement"
最后安装ipa时,如果装不上提示"Mismatche...onIdentifierEntitlement",一定要卸载设备里的现有的微信app!!!!!!!!!!!!!还有就是,如 ...
- C# Task中的Func, Action, Async与Await的使用
在说Asnc和Await之前,先说明一下Func和Action委托, Task任务的基础的用法 1. Func Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate, ...
- 【css】垂直居中的几种写法
结构 <div class="vam"> <div class="vam-body">垂直居中</div> </div ...
- Windows server 2008普通用户不能远程登录问题
1.查登录权限 如果文件服务器没有为用户授权,那么用户自然就不能远程登录服务器系统了,为此笔者决定先仔细检查一下文件服务器系统是否为自己使用的登录账号,授予了远程登录权限.在进行这种检查时,笔者先是在 ...
- linux搭建FTP服务器并整合Nginx
操作系统:Centos7 1.1.服务器配置 # 关闭SELINUX,把SELINUX=enforcing改为SELINUX=disabled,reboot重启服务器生效 vim /etc/sysco ...