最小生成樹,prim算法

Prim算法和Kruskal算法都是用于解決最小生成樹問題的經典算法,它們在不同情況下有不同的適用性和特點。

Prim算法:

Prim算法是一種貪心算法,用于構建一個無向圖的最小生成樹。算法從一個初始節點開始,逐步添加與當前樹連接且具有最小權重的邊,直到所有節點都被連接。Prim算法的基本思想是從一個起始節點出發,每次選擇一個與當前最小生成樹相連的節點中,權重最小的邊,將這個節點加入最小生成樹中,并將其相連的邊考慮進來。這樣逐步擴展最小生成樹,直至所有節點都被包含。

Kruskal算法:

Kruskal算法也是一種貪心算法,用于構建一個無向圖的最小生成樹。該算法首先將圖中的所有邊按照權重從小到大進行排序,然后從最小權重邊開始,依次將邊加入生成樹中,但要保證加入邊不會形成環。如果加入某條邊會導致環的形成,則放棄該邊,繼續考慮下一條權重較小的邊,直到生成樹中包含了所有的節點。

區別:

基本思想:Prim算法從一個起始節點開始,逐步添加與當前最小生成樹相連的具有最小權重的邊。Kruskal算法通過排序邊,然后逐個添加邊,保證不形成環。

頂點處理:Prim算法在每一步選擇中,僅考慮與當前已選擇頂點相連的頂點,直接操作頂點Kruskal算法是通過遍歷邊的方式進行操作,不直接關心頂點。

數據結構:Prim算法通常使用優先隊列(最小堆)來維護待選的邊,以便每次選擇具有最小權重的邊。Kruskal算法則通常使用并查集來判斷是否會形成環。

性能:在邊的數量較少,而頂點的數量較多時,Prim算法通常會更有效。而在邊的數量較多,而頂點的數量較少時,Kruskal算法可能更適用。

復雜度:Prim算法的時間復雜度通常在 O(V^2) 到 O(E* log(V)) 之間,取決于實現方式。Kruskal算法的時間復雜度主要由排序邊的復雜度決定,通常為 O(E * log(E))。

總的來說,兩種算法都能有效地構建最小生成樹,但在不同情況下選擇合適的算法可以提高效率。

1135. 最低成本聯通所有城市

想象一下你是個城市基建規劃者,地圖上有 n 座城市,它們按以 1 到 n 的次序編號。

給你整數 n 和一個數組 conections,其中 connections[i] = [xi, yi, costi] 表示將城市 xi 和城市 yi 連接所要的costi(連接是雙向的)。

返回連接所有城市的最低成本,每對城市之間至少有一條路徑。如果無法連接所有 n 個城市,返回 -1

該 最小成本 應該是所用全部連接成本的總和。

在這里插入圖片描述
代碼實現:

// 定義邊
struct Edge{int city;int cost;
};// 定義 邊的比較方法
// cost值較小的Edge對象具有更高的優先級,
// 因為EdgeComparator在a的cost大于b的cost時返回true,
// 這意味著在優先級隊列中,a應該在b之后。
// 所以,這個優先級隊列是一個最小堆(min heap),即隊列頂部總是cost最小的Edge對象
struct EdgeComparator{bool operator()(const Edge& a,const Edge& b){return a.cost>b.cost;}
};class Solution {
public:int minimumCost(int n, vector<vector<int>>& connections) {// 連接所有點需要的costint cost = 0;vector<vector<Edge>> edges(n+1);// 定義訪問數組vector<bool> visited(n+1,false);//  定義優先隊列, cost小的排在前面priority_queue<Edge, vector<Edge>, EdgeComparator> minHeap;visited[1] = true;// 從城市1開始// 建立Edge二維數組// 每個點會對應一個list,每個list中存儲:和這個點相連的城市以及到相連城市的距離for(const auto& conn:connections){// 是雙向的edges[conn[0]].push_back(Edge{conn[1],conn[2]});edges[conn[1]].push_back(Edge{conn[0],conn[2]});}// 先把和1點相連的Edge進行排序,放入優先隊列for(const Edge& edge:edges[1]){minHeap.push(edge);}// 連接點的數量,初始為1int count = 1;while(!minHeap.empty()){Edge e = minHeap.top();minHeap.pop();if(visited[e.city]){// 如果已經訪問過某一點了,則直接進入下一次循環continue;}// 如果沒有訪問過,就設置為truevisited[e.city] = true;// 再把和這個點相連的Edge push進優先隊列for(const Edge& edge:edges[e.city]){minHeap.push(edge);}cost += e.cost;// 連接點的數量+1count++;if(count == n){return cost;}}return -1;}
};

1584. 連接所有點的最小費用

給你一個points 數組,表示 2D 平面上的一些點,其中 points[i] = [xi, yi] 。

連接點 [xi, yi] 和點 [xj, yj] 的費用為它們之間的 曼哈頓距離 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的絕對值。

請你返回將所有點連接的最小總費用。只有任意兩點之間 有且僅有 一條簡單路徑時,才認為所有點都已連接。

在這里插入圖片描述

完全仿照上面一題的代碼,寫出了這題的代碼,唯二的區別在于,需要自己額外計算一下每個點之間的距離,并且不滿足條件時返回0:

// 定義結構體Edge
struct Edge{int city;int cost;
};struct EdgeComparator{bool operator()(const Edge& a,const Edge& b){return a.cost>b.cost;}
};// 計算曼哈頓距離
int compute_Manhattan(vector<vector<int>>& points,int p1,int p2){return abs(points[p1][0]-points[p2][0]) + abs(points[p1][1]-points[p2][1]);
}class Solution {
public:int minCostConnectPoints(vector<vector<int>>& points) {int cost = 0;int n = points.size();// 點的個數vector<vector<Edge>> edges(n);priority_queue<Edge, vector<Edge>, EdgeComparator> minHeap;vector<bool> visited(n,false); // 訪問數組visited[0] = true; // 從0點開始searchint count = 1; // 已經訪問到了的點(已經相連的點)// 建立了 鄰接表for(int i = 0;i<n-1;i++){for(int j = i+1;j<n;j++){// 兩點間的曼哈頓距離int distance = compute_Manhattan(points,i,j);edges[i].push_back(Edge{j,distance});edges[j].push_back(Edge{i,distance});}}// 把和0點相關的點push進最小堆for(const Edge& edge:edges[0]){minHeap.push(edge);}while(!minHeap.empty()){Edge e = minHeap.top();minHeap.pop();if(visited[e.city]){// 如果已經訪問過該點,則進入下一次循環continue;}visited[e.city] = true; // 標記訪問過該點// 再把和該點相連的點push 進 minHeapfor(const Edge& edge:edges[e.city]){minHeap.push(edge);}cost += e.cost; // 加上和這個點相連的costcount++;if(count == n){// 如果n個點都相連了,返回cost即可return cost;}}return 0;}
};

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

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

相關文章

【自動電壓調節器】無功功率控制的終端電壓控制研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

小白的Node.js學習筆記大全---不定期更新

let、const、var的區別 &#xff08;1&#xff09;塊級作用域&#xff1a; 塊作用域由 { }包括&#xff0c;let和const具有塊級作用域&#xff0c;var不存在塊級作用域。塊級作用域解決了ES5中的兩個問題&#xff1a; 內層變量可能覆蓋外層變量 用來計數的循環變量泄露為全局…

【加強管理】《別輸在不懂管理上》學習記錄,黃金41條

成功有時是很難效法的&#xff0c;但失敗是可以避免的&#xff0c;從失敗中吸取經驗和教訓才是管理者的必修課。釋義&#xff1a; 圖形含義&#x1f332;一級重要&#x1f340;二級重要&#x1f33f;三級主要&#x1f341;存在問題&#x1f33c;解決辦法 1 不能從頭管到腳 不…

【討論】視頻監控集中存儲方案如何做?

視頻監控集中存儲是指將多個視頻監控攝像頭所捕捉到的視頻信號集中存儲于一個中央設備&#xff0c;這個中央設備可以是服務器、網絡存儲設備或其他專用設備。通過集中存儲&#xff0c;可以避免因為存儲設備分散而導致的管理不便和難以有效地管理和檢索視頻數據&#xff0c;同時…

RTT(RT-Thread)ADC設備(RTT保姆級介紹)

目錄 ADC設備 前言 ADC相關參數說明 訪問ADC設備 配置ADC設備 ADC實例 硬件設計 軟件設計 ADC設備 前言 ADC(Analog-to-Digital Converter) 指模數轉換器。是指將連續變化的模擬信號轉換為離散的數字信號的器件。 對于ADC的詳細介紹和在STM32中的裸機應用可參考以下…

pandas數據分析38——數據框表格拓展以及縮回對齊

案例背景 需求是這個樣的&#xff1a; 把這個表格進行拓展。 代碼實現&#xff1a; df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小紅, 小馬,小天]])) df 方法一&#xff1a;自定義函數&#xff1a; def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

linux系統中設置服務開機自啟動

1&#xff1a;背景描述 最近根據工作需要&#xff0c;需要服務實現開機自啟動的效果&#xff0c;因為平時只使用過nohup的后臺掛起操作&#xff0c;很少接觸開機&#xff0c;鏡像裝機服務自啟動的功能&#xff0c;因此&#xff0c;這里簡單記錄一下。 注意&#xff0c;開機自…

解鎖數據潛力:信息抽取、數據增強與UIE的完美融合

解鎖數據潛力&#xff1a;信息抽取、數據增強與UIE的完美融合 1.信息抽取&#xff08;Information Extraction&#xff09; 1.1 IE簡介 信息抽取是 NLP 任務中非常常見的一種任務&#xff0c;其目的在于從一段自然文本中提取出我們想要的關鍵信息結構。 舉例來講&#xff0…

從NLP到聊天機器人

一、說明 今天&#xff0c;當打電話給銀行或其他公司時&#xff0c;聽到電話另一端的機器人向你打招呼是很常見的&#xff1a;“你好&#xff0c;我是你的數字助理。請問你的問題。是的&#xff0c;機器人現在不僅可以說人類語言&#xff0c;還可以用人類語言與用戶互動。這是由…

windows權限維持—黃金白銀票據隱藏用戶遠控RustDeskGotoHttp

windows權限維持—黃金白銀票據&隱藏用戶&遠控&RustDesk&GotoHttp 1. 前置1.1. 初始問題1.1.1. 解決辦法 2. 隱藏用戶2.1. 工具原理2.2. 案例操作2.2.1. 單機添加用戶2.2.1.1. 工具添加用戶2.2.1.2. 工具查看隱藏用戶2.2.1.3. 本地查看隱藏用戶 2.2.2. 域內添加…

CentOS系統環境搭建(二)——Centos7設置時間為網絡時間

centos系統環境搭建專欄&#x1f517;點擊跳轉 Centos7設置時間為網絡時間 安裝ntpdate工具 yum -y install ntp ntpdate關閉ntpd service ntpd stop設置系統時間與網絡時間同步 ntpdate 0.asia.pool.ntp.org將系統時間寫入硬件時間 hwclock --systohc查看和設置時區 使…

NeuralNLP-NeuralClassifier的使用記錄(二),訓練預測自己的【中文文本多分類】

NeuralNLP-NeuralClassifier的使用記錄&#xff0c;訓練預測自己的【中文文本多分類】 數據準備&#xff1a; ? 與英文的訓練預測一致&#xff0c;都使用相同的數據格式&#xff0c;將數據通過代碼處理為JSON格式&#xff0c;以下是我使用的一種&#xff0c;不同的原數據情況…

java+springboot+mysql理發會員管理系統

項目介紹&#xff1a; 使用javaspringbootmysql開發的理發會員管理系統&#xff0c;系統包含超級管理員&#xff0c;系統管理員、客戶、發型師角色&#xff0c;功能如下&#xff1a; 超級管理員&#xff1a;管理員管理&#xff1b;會員管理&#xff1b;發型師管理&#xff1b…

如何保證數據庫的數據和Redis的數據一致性

實際項目中有可能會使用Redis緩存數據&#xff0c;那么在更新數據的時候如何保證數據庫中的數據和Redis緩存的數據一致&#xff0c;緩存同步策略的選擇是一個很重要的問題。網上有各種說法&#xff0c;大概總結有以下幾種&#xff0c;看看每種方案是否可行以及存在的問題和適用…

安裝軟件包

安裝軟件包 創建一個名為 /home/curtis/ansible/packages.yml 的 playbook : 將 php 和 mariadb 軟件包安裝到 dev、test 和 prod 主機組中的主機上 將 RPM Development Tools 軟件包組安裝到 dev 主機組中的主機上 將 dev 主機組中主機上的所有軟件包更新為最新版本 vim packa…

關于Firmae缺失binwalk模塊

問題 david707:~/FirmAE$ sudo ./run.sh -c weyow ./WAM_9900-20.06.03V.trx [*] ./WAM_9900-20.06.03V.trx emulation start!!! Traceback (most recent call last):File "./sources/extractor/extractor.py", line 19, in <module>import binwalk ModuleNot…

Android Studio調試的時候Logcat不顯示日志了

文章目錄 問題描述解決方案 問題描述 使用Log輸出日志的時候&#xff0c;Logcat窗口并沒有顯示日志。 去除所有的過濾條件之后&#xff0c;Logcat窗口仍然沒有一條消息。 解決方案 關閉Android Studio&#xff0c;重啟Android Studio即可。

Docker容器:docker基礎概述、安裝、網絡及資源控制

文章目錄 一.docker容器概述1.什么是容器2. docker與虛擬機的區別2.1 docker虛擬化產品有哪些及其對比2.2 Docker與虛擬機的區別 3.Docker容器的使用場景4.Docker容器的優點5.Docker 的底層運行原理6.namespace的六項隔離7.Docker核心概念 二.Docker安裝 及管理1.安裝 Docker1.…

【k8s】基于Prometheus監控Kubernetes集群安裝部署

目錄 基于Prometheus監控Kubernetes集群安裝部署 一、環境準備 二、部署kubernetes集群 三、部署Prometheus監控平臺 四、部署Grafana服務 五、grafana web操作 基于Prometheus監控Kubernetes集群安裝部署 一、環境準備 IP地址 主機名 組件 192.168.100.131 k8s-ma…

時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測

時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測 目錄 時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積門控循環單元時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 時序預測 | MATLAB實現WOA-CNN-GRU鯨魚算法優化卷積…