算法筆記_164:算法提高 最小方差生成樹(Java)

目錄

1 問題描述

2 解決方案

?


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();}}
}

?

轉載于:https://www.cnblogs.com/liuzhen1995/p/6786554.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370890.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

番石榴分配器vs StringUtils

因此&#xff0c;我最近寫了一篇有關舊的&#xff0c;可靠的Apache Commons StringUtils的文章 &#xff0c;該文章引起了一些評論&#xff0c;其中之一是Google Guava提供了更好的連接和拆分字符串的機制。 我必須承認&#xff0c;這是我尚未探索的番石榴的一個角落。 因此&am…

layui數據表格(一:基礎篇,數據展示、分頁組件、表格內嵌表單和圖片)

表格展示神器之一&#xff1a;layui表格 前言&#xff1a;在寫后臺管理系統中使用最多的就是表格數據展示了&#xff0c;使用表格組件能提高大量的開發效率&#xff0c;目前主流的數據表格組件有bootstrap table、layui table、easyUI table等.... 博主個人比較傾向于layui&am…

算法設計與分析_算法設計與分析(第2版)第2章分治策略回顧

YI時間&#xff5c;外刊&#xff5c;MM-DFW&#xff5c;機器學習系列點擊上方藍字&#xff0c;關注給你寫干貨的松子茶分治策略是通用算法設計技術之一&#xff0c;很多有效的算法是它的特殊實現,顧名思義就是分而治之。一個問題能夠用分治法求解的要素是問題能夠按照某種方式分…

2017-2018-1 Java演繹法 第三周 作業

團隊任務&#xff1a;團隊展示與選題團隊展示 隊員學號及姓名 學號  姓名  主要負責工作  20162315  馬軍  日常統計&#xff0c;項目部分代碼  20162316  劉誠昊  項目部分代碼&#xff0c;代碼質量測試  20162317  袁逸灝  組長 項目 主要 代碼  201…

linux開機啟動roscore,樹莓派ubuntuMate系統中開機自啟動ROS的launch文件

0x00 為何需要開機自啟動launch文件在ROS開發后期階段由于功能已經趨于穩定&#xff0c;因此就需要系統在一上電啟動后就自動把ROS下的各節點程序加載運行&#xff0c;這樣就省去了我們還得手動輸入roslaunch命令來加載bringup的launch文件的操作。經過我的實際測試目前有兩種方…

Oracle ADF移動世界! 你好!

您好&#xff0c;ADF Mobile&#xff0c;世界&#xff01; 您可能已經知道... ADF Mobile在這里&#xff01; 以下是一些鏈接&#xff0c;這些鏈接會讓您有賓至如歸的感覺。 ADF Mobile主頁&#xff1a; http://www.oracle.com/technetwork/developer-tools/adf/overview/ad…

Bootstrap里的文件分別代表什么意思及其引用方法

關于Bootstrap打包的文件分別代表什么意思&#xff0c;官網也沒有給出一個明確的解釋&#xff0c;在網上查了一些資料&#xff0c;總價歸納了如下&#xff1a; bootstrap/ <!--主目錄--> ├── css/ <!--CSS樣式文件--> │ ├── bootstrap.css <!…

css 小知識點:inline/inline-block/line-height

inline: 此元素會被顯示為內聯元素&#xff0c;元素前后沒有換行符。因此&#xff1a;無法設置寬度和高度&#xff5e; inline-block: 行內塊元素。元素前后沒有換行符&#xff08;CSS2.1 新增的值&#xff09; 用通俗的話講&#xff0c;就是不獨占一行的塊級元素。然后擁有…

Linux外域遞送郵件,求助:外域郵件發送不了 (頁 1) - iRedMail 技術支持 - iRedMail 開源郵件服務解決方案...

必填信息。沒有填寫將不予回復 - iRedMail 版本號&#xff1a; v0.9.5-1- 使用哪個數據庫存儲用戶帳號(OpenLDAP&#xff0c;MySQL&#xff0c;PostgreSQL)&#xff1a; v0.6.1 (MySQL)- 使用的 Linux/BSD 發行版名稱及版本號&#xff1a;CentOS 6.5- 與您的問題相關的日志…

協同過濾算法_機器學習 | 簡介推薦場景中的協同過濾算法,以及SVD的使用

本文始發于個人公眾號&#xff1a;TechFlow&#xff0c;原創不易&#xff0c;求個關注今天是機器學習專題的第29篇文章&#xff0c;我們來聊聊SVD在上古時期的推薦場景當中的應用。推薦的背后邏輯有沒有思考過一個問題&#xff0c;當我們在淘寶或者是某東這類電商網站購物的時候…

JavaOne 2012:觀察與印象

當我坐在舊金山國際機場等待登上飛機返回家中時&#xff0c;我一次又一次令人滿意但累人的JavaOne&#xff08;2012&#xff09;體驗&#xff0c;我正在開始寫這篇特別的博客文章。 自上周日的主題演講以來&#xff0c;在會議上瘋狂地撰寫了約30篇博客文章之后&#xff0c;很難…

less學習三---父選擇器

引用父選擇器需要用到“&”符號 &#xff06;運算符表示嵌套規則的父選擇器&#xff0c;并且在修改類或偽類選擇器的應用中非常普遍 ul{li{&:nth-child(2) a {color: red;&:hover {color: yellow;}}} }//編譯為 ul li:nth-child(2) a {color: red; } ul li:nth-ch…

SaltStack匹配target-第六篇

練習內容 Salt遠程執行中目標選擇常用的模式 1.通配符匹配 2.正則表達式匹配 3.List支持 4.Grains匹配 5.IP地址匹配 6.混合匹配 7.Node groups 遠程執行格式 target就是我們要選擇的minion salt <target> <function> [arguments] 一&#xff0c;通配符匹配&#x…

heartbeat+drbd+mysql

配置heartbeat接管drbd服務 配置heartbeat接管drbd服務&#xff08;延續之前heartbeat及drbd博文內容&#xff09;1、兩端確認都建立好 /data目錄2、關閉drbd服務,關閉heartbeat服務&#xff0c;自啟動全部關閉3、兩端配置haresourcesdata-1-1 IPaddr::192.168.0.191/24/eth0 d…

在linux下dns綁定域名,在Linux系統中,使用Bind搭建DNS域名解析服務

DNS域名解析服務(DomainNameSystem)是用于解析域名與IP地址對應關系的服務作用為維護著一個地址數據庫&#xff0c;記錄著各種主機域名與IP地址的對應關系&#xff0c;以便為客戶提供正向或反向的地址查詢服務&#xff0c;即正向解析與反向解析。正向解析&#xff1a;將制定的域…

用imspost制作catia后處理_新產品開發需要做原型驗證,怎么樣成型制作才省錢?...

有一天一個朋友拿著一個公仔機器人的項目過來找我&#xff0c;說做200套外殼&#xff0c;問我如何省成本用最少的錢做好產品。類似一下圖片的機器人一樣。組裝起來高200mm左右&#xff0c;內外配件總共是62個。我當時看到產品小估算重量也很輕&#xff0c;就跟他說用3D打印有快…

如何把大段文字轉為帶html標簽的文字

開發網頁的時候&#xff0c;有時候會遇到大段的隱私聲明&#xff0c;用戶協議等等&#xff0c;我們呀要復制粘貼展示出來&#xff0c;必須加大量的p標簽&#xff0c;h1,h2&#xff0c;空格符&#xff0c;br標簽&#xff0c;這對我們來說無疑是淚崩的&#xff0c;有個很好的辦法…

使用MongoDB進行事件流

MongoDB是一個非常出色的“ NoSQL”數據庫&#xff0c;具有廣泛的應用程序。 在SoftwareMill開發的一個項目中&#xff0c;我們將其用作復制的事件存儲&#xff0c;然后將事件從事件流傳輸到其他組件。 介紹 基本思想非常簡單&#xff08;另請參閱Martin Fowler關于Event Sou…

hihocoder-Week173--A Game

hihocoder-Week173--A Game A Game 時間限制:10000ms單點時限:1000ms內存限制:256MB描述 Little Hi and Little Ho are playing a game. There is an integer array in front of them. They take turns (Little Ho goes first) to select a number from either the beginning …

php打亂數組二維數組、多維數組

//這個是針對二維數組的!下面針對多維數組的亂序方法<?php function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys array_keys($list); shuffle($keys); $random array(); foreach ($keys as $key) $random[$key] $list[$key]; ret…