算法提高 最小方差生成树(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,而带宽范围也不大,可 ...
随机推荐
- 5、python的变量和常量
今天看看python的变量和常量,这是python中最基本的两个概念. 首先先说一下解释器执行Python的过程: python3 C:\test.py 1. 启动python解释器(内存中) ...
- SharePoint REST 服务获取讨论版问题
前言 最近,有这么个需求,需要获取讨论版里的问题,然后汇总,这里就考虑用REST服务了. 1.我们先创建这么一个讨论版列表,然后添加一些问题,如下图: 2.然后需要开发REST服务代码了,如下图: 3 ...
- IDEA手工添加webapp目录
自己手工建目录,是没法识别的,在自己手工建的webapp文件夹上右键菜单,Make Directory As也没有相应的选项 解决方案是 File->Project Structure
- [PHP] 多表外连接性能测试及优化
原文:https://blog.csdn.net/tang_huan_11/article/details/41925639 版权声明:本文为博主原创文章,转载请附上博文链接!
- ubuntu redis 自启动配置文件(关机有密码)
#!/bin/bash # chkconfig : ### BEGIN INIT INFO # Provides: redis-server # Required-Start: $syslog $re ...
- Netty 中ChannelOption的含义以及使用的场景
Netty 中ChannelOption的含义以及使用的场景 转自:http://www.cnblogs.com/googlemeoften/p/6082785.html 1.ChannelOptio ...
- iOS 随机数获取
//获取一个32位随机数 static const char _randomStr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv ...
- URL参数编码
简单明了区分escape.encodeURI和encodeURIComponent 一.前言讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它 ...
- DockerSwarm获取Token与常用命令
一.Token相关 Join tokens是允许一个节点加入集群的密钥.有两种可用的不同的join tokens,一个是用作worker角色,另一个是用作manager角色.在执行swarm join ...
- java 根据身份证号码获取出生日期、性别、年龄
1.情景展示 如何根据身份证号,计算出出生日期.性别.年龄? 2.解决方案 从网上找的别人的,因为并没有实际用到,所以并未对其优化! /** * 通过身份证号码获取出生日期.性别.年龄 * @pa ...