Java实现 蓝桥杯 算法提高最小方差生成树
1 问题描述
给定带权无向图,求出一颗方差最小的生成树。
输入格式
输入多组测试数据。第一行为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组。
2 解决方案
本题主要考查Kruskal算法,其中的重点在于并查算法的应用,在寻找最小平方差的最小生成树时,需要枚举边权值的均值。
但是,依照这样的方法,在蓝桥练习系统中测评一直为50分,在网上找了一下其他网友写的C代码,提交也是50分,可能是蓝桥练习系统的后台测试数据有点问题,也有可能是本题枚举的精确度不够。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static int n, m;
public static double minV; //输入所有边中权值最小的边
public static double maxV; //输入所有边中权值最大的边
public static int[] id;
public static ArrayList<edge> map;
public static ArrayList<Double> result = new ArrayList<Double>();
class MyComparator implements Comparator<edge> {
public int compare(edge arg0, edge arg1) {
if(arg0.w > arg1.w)
return 1;
else if(arg0.w < arg1.w)
return -1;
return 0;
}
}
static class edge {
public int a; //边的起点
public int b; //边的终点
public double v; //边的权值
public double w; //边权的方差值
public edge(int a, int b, double v) {
this.a = a;
this.b = b;
this.v = v;
this.w = 0;
}
}
public void init() {
minV = Double.MAX_VALUE;
maxV = Double.MIN_VALUE;
map = new ArrayList<edge>();
}
public int find(int a) {
int root = a;
while(id[root] >= 0) {
root = id[root];
}
int k = a, i;
while(k != root) {
i = id[k];
id[k] = root;
k = i;
}
return root;
}
public void union(int a, int b) {
int rootA = find(a);
int rootB = find(b);
if(rootA == rootB)
return;
int num = id[rootA] + id[rootB];
if(id[rootA] < id[rootB]) {
id[rootB] = rootA;
id[rootA] = num;
} else {
id[rootA] = rootB;
id[rootB] = num;
}
}
public void getResult() {
double avg = minV;
double minResult = Double.MAX_VALUE;
for(;avg <= maxV;avg = avg + 0.3) { //此处是解决本题的关键,即枚举最小生成树的边权的均值
for(int i = 0;i < map.size();i++) {
double v = map.get(i).v - avg;
map.get(i).w = v * v;
}
Collections.sort(map, new MyComparator());
id = new int[n + 1];
for(int i = 1;i <= n;i++)
id[i] = -1;
double sum = 0;
double[] value = new double[n - 1];
int count = 0;
for(int i = 0;i < map.size();i++) {
int rootA = find(map.get(i).a);
int rootB = find(map.get(i).b);
if(rootA != rootB) {
union(map.get(i).a, map.get(i).b);
value[count++] = map.get(i).v;
sum += map.get(i).v;
if(count == n - 1)
break;
}
}
sum = sum / (n - 1);
double temp = 0;
for(int i = 0;i < value.length;i++) {
temp = temp + (value[i] - sum) * (value[i] - sum);
}
temp = temp / (n - 1);
if(minResult > temp)
minResult = temp;
}
result.add(minResult);
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
while(true) {
n = in.nextInt();
m = in.nextInt();
if(n == 0 || m == 0)
break;
test.init();
for(int i = 1;i <= m;i++) {
int a = in.nextInt();
int b = in.nextInt();
double v = in.nextDouble();
map.add(new edge(a, b, v));
minV = Math.min(minV, v);
maxV = Math.max(maxV, v);
}
test.getResult();
}
for(int i = 0;i < result.size();i++) {
System.out.print("Case "+(i+1)+": ");
System.out.printf("%.2f", result.get(i));
System.out.println();
}
}
}
Java实现 蓝桥杯 算法提高最小方差生成树的更多相关文章
- 算法提高 最小方差生成树(Kruskal)_模板
算法提高 最小方差生成树 时间限制:1.0s 内存限制:256.0MB 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是 ...
- 算法笔记_164:算法提高 最小方差生成树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...
- Java实现 蓝桥杯 算法提高 进攻策略加强(暴力)
试题 算法提高 进攻策略加强 问题描述 植物大战僵尸这款游戏中,还有一个特别的玩儿法:玩家操纵僵尸进攻植物. 首先,僵尸有m种(每种僵尸都是无限多的),玩家可以选择合适的僵尸来进攻.使用第i种僵尸需要 ...
- Java实现 蓝桥杯 算法提高 小X的购物计划
试题 算法提高 小X的购物计划 问题描述 小X打算去超市shopping.小X没什么钱,只有N元.超市里有M种物品,每种物品都需要money,在小X心中有一个重要度.有的物品有无限件,有的物品只有几件 ...
- Java实现蓝桥杯 算法提高 线段和点
算法提高 线段和点 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 有n个点和m个区间,点和区间的端点全部是整数,对于点a和区间[b,c],若a>=b且a<=c,称点a满 ...
- Java实现 蓝桥杯 算法提高 学霸的迷宫
算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...
- Java实现 蓝桥杯 算法提高 周期字串
算法提高 周期字串 时间限制:1.0s 内存限制:256.0MB 问题描述 右右喜欢听故事,但是右右的妈妈总是讲一些"从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲的什么呢?从前有 ...
- Java实现 蓝桥杯 算法提高 最大乘积
算法提高 最大乘积 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入格式 第一行一个数表示数据组数 每组输入数据共2 ...
- Java实现 蓝桥杯 算法提高 新建Microsoft world文档
算法提高 新建Microsoft Word文档 时间限制:1.0s 内存限制:256.0MB 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:"你出的题目叫&l ...
随机推荐
- SEO策略之关键词选择的原则
策略就是指为了实现某一个目标而预先制定的能够实施的方案.在制定SEO策略的时候,我们需要了解网站所有的基本情况,同时又要对网站所处的行业的竞争对手有一个准确的数据分析.SEO策略有几个比较突出的属性: ...
- Python 的缩进是不是反人类的设计?
前些天,我写了<Python为什么使用缩进来划分代码块?>,文中详细梳理了 Python 采用缩进语法的 8 大原因.我极其喜欢这种简洁优雅的风格,所以对它赞美有加. 然而文章发出去后,非 ...
- web scraper插件爬虫进阶(能满足非技术人员的爬虫需求,建议收藏!!!!)
为了照顾更多的小伙伴,大家的学习能力及了解程度都不同,因此大家可以通过以下目录来有选择性的学习,节约大家的时间. 备注: 一定要实操!!! 一定要实操!!! ...
- React知识点整理
面试题:三大框架中数据绑定实现上有何绑定? 一.概述:是Facebook维护的一个构建用户界面的JS库,核心很精简,但是生态圈扩展很大. React:MVVM框架 React-Router:路由 Re ...
- 09 基于模块wsgiref版web框架
09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分: 服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...
- .net System.Web.Mail发送邮件 (设置发件人 只显示用户名)
http://blog.163.com/hao_2468/blog/static/130881568201141251642215/ .net System.Web.Mail发送邮件 2011-05- ...
- IE8/IE9/IE10打开网页后,自动设置浏览器模式为“IE8/IE9/IE10兼容性视图”
http://blog.snsgou.com/post-16.html 作者:SNSGOU 发布于:2013-07-17 22:23:05 分类:CSS/HTML 评论(0) 浏览(132 ...
- Web Scraper——轻量数据爬取利器
日常学习工作中,我们多多少少都会遇到一些数据爬取的需求,比如说写论文时要收集相关课题下的论文列表,运营活动时收集用户评价,竞品分析时收集友商数据. 当我们着手准备收集数据时,面对低效的复制黏贴工作,一 ...
- Kubernetes as Database: 使用kubesql查询kubernetes资源
写在前面 kubectl虽然查询单个的kubernetes资源或者列表都已经比较方便,但是进行更为多个资源的联合查询(比如pod和node),以及查询结果的二次处理方面却是kubectl无法胜任的.所 ...
- Siemens PLC分类和基本性能指标
PLC分类 整体式plc也成为单元式,特点是电源,中央处理器单元以及I/O借口都集成在一个机壳内. 标准摸板试结构化,也成为组合式,特点是电源,中央处理器单元模板以及I/O模板在结构上都是相互独立的, ...