最小生成樹刷題筆記

算法基礎:

首先是prim算法三部曲:

(1)找到距離最小生成樹最近的節點。

(2)將距離最小生成樹最近的節點加入到最小生成樹中。

(3)更新非最小生成樹節點到最小生成樹的距離。

實現步驟:

首先我們利用一個for循環遍歷n - 1遍,因為我們從第1個節點開始將其加入到生成樹之中后知道添加到還剩兩個節點時,我們可以發現當我們添加玩倒數第二個節點后,最后一個節點的mindist數值在處理倒數第二個節點的第三部更新過程中已經得到了,這個距離不是倒數第二個節點到它的距離grid[cur][j]就是之前已經得到的它與某個節點之間的距離mindist[j]。

(1)尋找最近節點:

判斷最近節點的三個條件:1.未在生成樹中。 ?2.距離生成樹距離最短 ? ? 3.選取最短距離我們先隨便選出一個節點然后再與其他節點比較

if(!isvisited[j] && (cur = -1 || mindist[cur] < mindist[j]) ? ? ? ? ? ? ?Cur = j;

這里我們每遍歷一層就會將cur置為-1以便我們可以最快選取一個隨機節點并遍歷后面的節點與之比較。而第二層的mindist[j]的值已經在第一層的第三步更新操作中得到。

(2)將最近節點加入生成樹:

isintree[cur] = true;

(3)更新非生成樹節點到生成樹距離:

利用一個for循環遍歷所以非生成樹節點,并更新起距離mindist[j] < grid[cur][j] ? Mindist[j] = mindist[j] : mindist[j] = grid[cur][j]

#include<iostream>
#include<vector>
using?namespace?std;
int?main()?{
????int?v,?e;
????int?x,?y,?k;
????cin?>>?v?>>?e;
????//?填一個默認最大值,題目描述val最大為10000
????vector<vector<int>>?grid(v?+?1,?vector<int>(v?+?1,?10001));
????while?(e--)?{
????????cin?>>?x?>>?y?>>?k;
????????//?因為是雙向圖,所以兩個方向都要填上
????????grid[x][y]?=?k;
????????grid[y][x]?=?k;

????}
????//?所有節點到最小生成樹的最小距離
????vector<int>?minDist(v?+?1,?10001);

????//?這個節點是否在樹里
????vector<bool>?isInTree(v?+?1,?false);

????//?我們只需要循環?n-1次,建立?n?-?1條邊,就可以把n個節點的圖連在一起
????for?(int?i?=?1;?i?<?v;?i++)?{

????????// 1、prim三部曲,第一步:選距離生成樹最近節點
????????int?cur?=?-1;?//?選中哪個節點?加入最小生成樹
????????for?(int?j?=?1;?j?<=?v;?j++)?{?//?1?-?v,頂點編號,這里下標從1開始
????????????//??選取最小生成樹節點的條件:
????????????//??(1)不在最小生成樹里
????????????//??(2)距離最小生成樹最近的節點
????????????//??(3)只要不在最小生成樹里,先默認選一個節點?,在比較?哪一個是最小的
????????????//??理解條件3 很重要,才能理解這段代碼:(cur ==?-1 || minDist[j]?< minDist[cur])
????????????if?(!isInTree[j]?&&?(cur?==?-1?||?minDist[j]?<?minDist[cur]))?{
????????????????cur?=?j;
????????????}
????????}
????????// 2、prim三部曲,第二步:最近節點(cur)加入生成樹
????????isInTree[cur]?=?true;

????????// 3、prim三部曲,第三步:更新非生成樹節點到生成樹的距離(即更新minDist數組)
????????//?cur節點加入之后,?最小生成樹加入了新的節點,那么所有節點到?最小生成樹的距離(即minDist數組)需要更新一下
????????//?由于cur節點是新加入到最小生成樹,那么只需要關心與?cur?相連的?非生成樹節點?的距離?是否比?原來?非生成樹節點到生成樹節點的距離更小了呢
????????for?(int?j?=?1;?j?<=?v;?j++)?{
????????????//?更新的條件:
????????????//?(1)節點是?非生成樹里的節點
????????????//?(2)與cur相連的某節點的權值?比?該某節點距離最小生成樹的距離小
????????????//?很多錄友看到自己?就想不明白什么意思,其實就是?cur?是新加入?最小生成樹的節點,那么?所有非生成樹的節點距離生成樹節點的最近距離?由于?cur的新加入,需要更新一下數據了
????????????if?(!isInTree[j]?&&?grid[cur][j]?<?minDist[j])?{
????????????????minDist[j]?=?grid[cur][j];
????????????}
????????}
????}
????//?統計結果
????int?result?=?0;
????for?(int?i?=?2;?i?<=?v;?i++)?{?//?不計第一個頂點,因為統計的是邊的權值,v個節點有?v-1條邊
????????result?+=?minDist[i];
????}
????cout?<<?result?<<?endl;

}

leetcode - 1584:連接所有點的最小費用

就是利用題目中的公式建立鄰接矩陣在套用上面的模板即可:

class Solution {
public:
? ? int minCostConnectPoints(vector<vector<int>>& points) {
? ? ? ? int n = points.size();
? ? ? ? vector<vector<int>> grid(n, vector<int>(n, 0));
? ? ? ? // 計算任意兩點之間的曼哈頓距離并填充到grid矩陣中
? ? ? ? for(int i = 0; i < n; i++){
? ? ? ? ? ? for(int j = i + 1; j < n; j++){
? ? ? ? ? ? ? ? int x = abs(points[i][0] - points[j][0]);
? ? ? ? ? ? ? ? int y = abs(points[i][1] - points[j][1]);
? ? ? ? ? ? ? ? grid[i][j] = grid[j][i] = x + y;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? vector<bool> isvisited(n, false);
? ? ? ? vector<int> mindist(n, INT_MAX);
? ? ? ? mindist[0] = 0; // 從第一個點開始
? ? ? ? int res = 0;
? ? ? ? for(int i = 0; i < n - 1; i++){
? ? ? ? ? ? int cur = -1;
? ? ? ? ? ? // 選擇當前距離生成樹最近的節點
? ? ? ? ? ? for(int j = 0; j < n; j++){
? ? ? ? ? ? ? ? if(!isvisited[j] && (cur == -1 || mindist[j] < mindist[cur])){
? ? ? ? ? ? ? ? ? ? cur = j;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? isvisited[cur] = true;
? ? ? ? ? ? // 更新其他節點到生成樹的距離
? ? ? ? ? ? for(int j = 0; j < n; j++){
? ? ? ? ? ? ? ? if(!isvisited[j] && mindist[j] > grid[cur][j]){
? ? ? ? ? ? ? ? ? ? mindist[j] = grid[cur][j];
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? for(int i = 1; i < n; i++){
? ? ? ? ? ? res += mindist[i];
? ? ? ? }
? ? ? ? return res;
? ? }

?

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

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

相關文章

HTML批量文件上傳3—Servlet批量文件處理FileUpLoad

作者:私語茶館 1.開源的文件上傳組件介紹 本文使用的是Apache Commons下面的一個子項目FileUpload,另外一個常見組件是SmartUpload。FileUpload遵循RFC 1897,即“Form-based File Upload in HTML”,對于請求需要滿足:HTTP協議,Post請求,content Type=“multipart/form-d…

Kafka 面試題(五)

1. kafka的消費者是pull(拉)還是push(推)模式&#xff0c;這種模式有什么好處&#xff1f; Kafka的消費者是pull&#xff08;拉&#xff09;模式。在這種模式下&#xff0c;消費者主動從Kafka的broker中拉取數據來進行消費。 這種pull模式的好處主要體現在以下幾個方面&#…

人工智能是什么

人工智能是一個廣泛的領域&#xff0c;其中包括了機器學習和深度學習。 - 機器學習&#xff1a; 是人工智能的一個子領域&#xff0c;它關注的是讓計算機系統通過學習數據&#xff0c;從中獲取知識并做出預測或決策&#xff0c;而無需明確地編寫特定的規則。機器學習的方法包括…

kernel32.dll丟失要如何解決?電腦kernel32.dll文件下載方法

kernel32.dll丟失要怎么解決才好&#xff1f;其實針對這個問題還是有很多種的解決方法的&#xff0c;只要你明白了kernel32.dll的作用&#xff0c;了解kernel32.dll&#xff0c;那么就可以有很多種方法去解決&#xff0c;下面一起來看看吧。 一.了解kernel32.dll文件 kernel32…

6個超TM好用的神仙App推薦!

1. AI文本視頻生成工具——Jurilu Jurilu 是一款功能強大的 AI 文本視頻生成器&#xff0c;允許用戶快速將文本內容轉換成極具吸引力的視頻。它的使用非常簡單&#xff1a;只需要輸入文字&#xff0c;選擇想要的樣式和模板&#xff0c;Jurilu 就會自動將文字轉換成生動的視頻。…

Vue項目npm install certificate has expired報錯解決方法

1.Vue項目 npm install 安裝依賴突然報錯&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/zrender/download/zrender-4.3.0.tgz failed, reason: certificate has expired npm ERR! A com…

代碼隨想錄-算法訓練營day35【貪心算法05:無重疊區間、劃分字母區間、合并區間】

代碼隨想錄-035期-算法訓練營【博客筆記匯總表】-CSDN博客 第八章 貪心算法 part05● 435. 無重疊區間 ● 763.劃分字母區間 ● 56. 合并區間 詳細布置 今天的三道題目&#xff0c;都算是 重疊區間 問題&#xff0c;大家可以好好感受一下。 都屬于那種看起來好復雜&#xff…

AI預測福彩3D+排3實戰化賺米驗證第6彈2024年5月10日第6次測試

由于最近幾天會比較忙&#xff0c;空閑時間較少&#xff0c;為了盡快的發布預測結果&#xff0c;今天繼續把3D和排3合并至一篇文章進行發布。好了&#xff0c;直接上結果吧&#xff5e; 1.5月10日3D預測結果 百位&#xff1a;4、5、6、3、1、0 十位&#xff1a;4、2、5、7、…

一個可以同時使用USB和WIFI傳輸文件到電腦的軟件

雙軌快傳 結合USB2.0和WIFI6技術&#xff0c;通過1000Mbps網口實現每秒高達150MB的傳輸速率&#xff08;理論上可達40MB/s通過USB和110MB/s通過WIFI&#xff09;。 使用 模式 支持普通模式和Root模式&#xff0c;Root模式可訪問~/Android/data/與/data/data/目錄下的文件。 …

ETL-kettle數據轉換及組件使用詳解

目錄 一、txt文本轉換成excel 1、新建、轉換 2、構建流程圖 3、配置數據流圖中的各個組件 3.1、配置文件文本輸入組件 3.2、 配置Excel輸出組件 4、保存執行 二、excel轉換成mysql &#xff08;1&#xff09;在MySQL數據庫中創建數據庫&#xff0c;這個根據自身情況。我…

一文了解spring的aop知識

推薦工具 objectlog 對于重要的一些數據&#xff0c;我們需要記錄一條記錄的所有版本變化過程&#xff0c;做到持續追蹤&#xff0c;為后續問題追蹤提供思路。objectlog工具是一個記錄單個對象屬性變化的日志工具,工具采用spring切面和mybatis攔截器相關技術編寫了api依賴包&a…

機器學習實戰寶典:用scikit-learn打造智能應用

書接上文——《數據探險家的終極指南&#xff1a;用Python挖掘機器學習的奧秘》 前文我們在這段精彩的機器學習探險之旅中&#xff0c;從基礎概念出發&#xff0c;深入探索了使用Python和scikit-learn庫進行數據分析和模型構建的全過程。 我們首先了解了機器學習的基本原理&am…

Mysql 鎖

鎖 從鎖的性能有樂觀鎖和悲觀鎖&#xff1b;鎖的粒度有行鎖、頁鎖、表鎖&#xff1b;鎖的對數據庫操作類型有讀鎖、寫鎖、意向鎖 樂觀鎖&#xff1a;采用cas機制&#xff0c;不會阻塞數據庫操作&#xff0c;只會針對當前事務進行失敗重試。(用于寫操作不多的情況)悲觀鎖&…

[c++]多態的分析

多態詳細解讀 多態的概念多態的構成條件 接口繼承和實現繼承: 多態的原理:動態綁定和靜態綁定 多繼承中的虛函數表 多態的概念 -通俗的來說&#xff1a;當不同的對象去完成某同一行為時&#xff0c;會產生不同的狀態。 多態的構成條件 必須通過基類的指針或者引用調用虛函數1虛…

【C++刷題】優選算法——遞歸第一輯

什么是遞歸&#xff1f; 函數自己調用自己的情況為什么會用到遞歸&#xff1f; 本質&#xff1a;在解決主問題的時候衍生出一個相同處理過程的子問題&#xff0c;子問題再繼續衍生子問題…如何理解遞歸&#xff1f; 第一層次的理解&#xff1a;遞歸展開的細節圖第二層次的理解&…

C語言/數據結構——(鏈表的回文結構)

一.前言 今天在牛客網上刷到了一道鏈表題——鏈表的回文結構https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?&#xff0c;巧合的是它的解題思路恰好是我們一起分享過兩道鏈表題的匯總。這兩道題分別是反轉鏈表和鏈表的中間節點。廢話不多數&#xff0c…

mybatis 多表查詢

一對一&#xff1a; 第一&#xff1a;在一中的類添加另外一個類作為屬性。如&#xff08;在Order類中添加private User orderUser;&#xff09; 第二&#xff1a;在mapper.xml配置關聯。&#xff08;mapper接口不變&#xff09; <!-- resultMap標簽&#xff1a;解決查詢結…

Redis 源碼安裝和入門介紹

Linux下的redis源碼安裝 redis介紹 Redis 是一個開源&#xff08;BSD許可&#xff09;的&#xff0c;內存中的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。它支持多種類型的數據結構&#xff0c;如 字符串&#xff08;strings&#xff09;&#xff0c;…

智能商品計劃系統:引領未來零售業的革新之路

隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;和大數據技術已成為推動各行業革新的關鍵動力。在零售行業中&#xff0c;智能商品計劃系統的出現&#xff0c;正逐步改變著傳統的商品規劃與管理方式&#xff0c;為品牌注入新的活力與競爭力。本文將對智能商…

Java入門基礎學習筆記14——數據類型轉換

類型轉換&#xff1a; 1、存在某種類型的變量賦值給另一種類型的變量&#xff1b; 2、存在不同類型的數據一起運算。 自動類型轉換&#xff1a; 類型范圍小的變量&#xff0c;可以直接賦值給類型范圍大的變量。 byte類型賦值給int類型&#xff0c;就是自動類型轉換。 pack…