算法實踐--最小生成樹(Kruskal算法)

什么是最小生成樹(Minimum Spanning Tree)

每兩個端點之間的邊都有一個權重值,最小生成樹是這些邊的一個子集。這些邊可以將所有端點連到一起,且總的權重最小

下圖所示的例子,最小生成樹是{cf, fa, ab} 3條邊

?

Kruskal算法

用到上一篇中介紹的不相交集合(并查集)

首先,定義V是端點的集合,E是邊的集合,A為要求的最小生成樹集合

  • 初始A為空集合,每個端點都作為單獨的不相交集合
  • 將所有邊根據其權重進行排序
  • 對每條邊(v1, v2),如果其兩個端點數據不同的不相交集,則將該邊加到集合A中,同時將v1和v2合并
  • 最終得到的A即為最小生成樹

?

生成過程的示例圖

?

C++代碼示例

?

struct Edge {char vertex1;char vertex2;int weight;Edge(char v1, char v2, int w):vertex1(v1), vertex2(v2), weight(w) {}
};struct Graph {vector<char> vertice;vector<Edge> edges;
};unordered_map<char, char> PARENT;
unordered_map<char, int> RANK;char find(char vertex) {if (PARENT[vertex] == vertex) return PARENT[vertex];elsereturn find(PARENT[vertex]);    
}void MST(Graph& g) {vector<Edge> res;for (auto c : g.vertice) {PARENT[c] = c;RANK[c] = 0;}sort(g.edges.begin(), g.edges.end(), [](Edge x, Edge y) {return x.weight < y.weight;});   // O(E*log(E))for (Edge e : g.edges) {         // O(E)char root1 = find(e.vertex1);  // 最差O(E),因為有記錄深度,Find可以認為很快char root2 = find(e.vertex2);if (root1 != root2) {res.push_back(e);if (RANK[root1] > RANK[root2]) {PARENT[root2] = root1;RANK[root1]++;} else {PARENT[root1] = root2;RANK[root2]++;}}}for (Edge e : res) {cout << e.vertex1 << " -- " << e.vertex2 << "  " << e.weight << endl;}
}void Union( char vertex_1, char vertex_2 ) {
}int main() {char t[] = {'a', 'b', 'c', 'd', 'e', 'f'};Graph g;g.vertice = vector<char>(t, t + sizeof(t)/sizeof(t[0]));g.edges.push_back(Edge('a', 'b', 4));  // 稀疏圖用鏈來表示(E = O(V)) g.edges.push_back(Edge('a', 'f', 2));  // 如果是密集圖(E = O(V*V)), 用矩陣來表示g.edges.push_back(Edge('f', 'b', 5));  // 大部分感興趣的圖是稀疏的g.edges.push_back(Edge('c', 'b', 6));g.edges.push_back(Edge('c', 'f', 1));g.edges.push_back(Edge('f', 'e', 4));g.edges.push_back(Edge('d', 'e', 2));g.edges.push_back(Edge('d', 'c', 3));MST(g);return 0;
}

?

轉載于:https://www.cnblogs.com/logchen/p/10274863.html

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

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

相關文章

洽談 “會話技術” 純干貨趕緊收藏吧

文章目錄一、 HTTP協議二、 會話三、 cookie3.1概念和設置cookie3.2讀取cookie3.3設置cookie有效期3.4cookie是跨頁面的3.5刪除cookie3.6登錄案例3.7cookie特點四、 session4.1概念4.2設置session4.3獲取session4.4清除session4.5模擬購物車案例一、 HTTP協議 HTTP協議是Hyper…

[bzoj2729][HNOI2012]排隊 題解 (排列組合 高精)

Description 某中學有 n 名男同學&#xff0c;m 名女同學和兩名老師要排隊參加體檢。他們排成一條直線&#xff0c;并且任意兩名女同學不能相鄰&#xff0c;兩名老師也不能相鄰&#xff0c;那么一共有多少種排法呢&#xff1f;&#xff08;注意&#xff1a;任意兩個人都是不同的…

詳解 正則表達式

文章目錄一、概念二、作用三、語法規則3.1定義規則3.2符號簡介3.3preg_match用法詳解3.4詳解元字符3.4.1 \d和[0-9]3.4.2 \D和[^0-9]3.4.3^和$3.4.4*代表出現0次或者多次3.4.5代表出現1次或者多次3.4.5&#xff1f;代表出現0次或者1次3.4.6{n}3.4.7{n,}3.4.8{n,m}3.4.9點號&…

Java:控制臺輸入車輛信息,將信息保存至數據庫中

程序功能&#xff1a;控制臺輸入車輛信息&#xff0c;將信息保存至數據庫中 程序代碼如下&#xff1a; BaseDao.java package DAO_dome.kehozuoye; import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;i…

echars 3D地圖為區域自定義顏色

echars 3D地圖為區域自定義顏色問題延伸解決問題問題 根據項目需求&#xff0c;我們要將下面省級地圖中的個別市進行高亮&#xff08;不同顏色&#xff09;展示 延伸 首先跟大家介紹這個地圖的展示方式&#xff1a; 采用的是Vue框架中運用echarts地圖采用的是geo3D和scatt…

linux每日命令(31):tar命令

閱讀目錄(Content) 一&#xff0e;命令格式二. 命令功能三. 命令參數必要參數選擇參數四. 常見解壓、壓縮命令tar.gz.tar.gz 和 .tgz.bz2.tar.bz2.bz.tar.bz.Z.tar.Z.zip.rar五. 使用實例1&#xff1a;將文件全部打包成tar包2&#xff1a;查閱上述 tar包內有哪些文件3&#xff…

一文帶你吃透BFC

文章目錄面試高出場率什么是BFC觸發BFC的條件BFC的約束規則BFC可以解決的問題面試高出場率 在前端的面試中&#xff0c;經常會遇到BFC的問題&#xff0c;比如&#xff1a;說說你對BFC的理解、你在項目中運用到的BFC、BFC是什么、BFC的作用是什么。。。。 很多同學很懵逼&…

基于Python語言使用RabbitMQ消息隊列(一)

介紹 RabbitMQ 是一個消息中間人&#xff08;broker&#xff09;: 它接收并且發送消息. 你可以把它想象成一個郵局: 當你把想要寄出的信放到郵筒里時, 你可以確定郵遞員會把信件送到收信人那里. 在這個比喻中, RabbitMQ 就是一個郵筒, 同時也是郵局和郵遞員 . 和郵局的主要不同…

爆贊程序猿開發軟件

VSCode 使用 IntelliSense 超越語法突出顯示和自動完成&#xff0c;它提供基于變量類型、函數定義和導入模塊的智能完成 直接從編輯器調試代碼。啟動或附加到您正在運行的應用程序并使用斷點、調用堆棧和交互式控制臺進行調試 與 Git 和其他 SCM 提供商合作從未如此簡單。查…

如果你在北京失業了,別怕,記得去領這筆錢!最少2034元/月!

人在江湖飄&#xff0c;哪能不挨刀 公司倒閉&#xff0c;老板走人&#xff0c;公司裁人 …… 就要被迫失業了 別怕! 如果你在北京失業了 記得去領這筆錢——失業保險金 每月最多有2143元 雖然錢不多&#xff0c;但能解燃眉之急 幫助你度過困難日子 重點全程網上就能…

真實詮釋程序員日常的二十四張圖【你中了幾個】

當你打開遺留代碼時 扒下來項目后改了一行代碼…… 程序員調試css樣式的時候 當你的try catch 不起作用 產品經理對你說要兼容IE 沒有ui給你提供大小設計的結果 沒吃透需求直接開發的你 程序員修復bug的真實處境 當你開始使用庫&#xff0c;但忘記閱讀文檔 產品經理告訴你這只是…

Git學習原版手稿

手稿誕生記 Git學習的時候難免會有遺忘然后往復學習查看的過程&#xff0c;所以就形成了這個學習的手稿&#xff0c;記錄了Git使用過程中的大部分命令&#xff0c;今天在清理的時候偶然看到了這些記錄&#xff0c;而且最近也在寫Git的使用教程&#xff0c;大致的學習線路也是按…

程序員首選編程電腦【火爆來襲】

作為一名程序員肯定會常用到一些編程軟件&#xff0c;所以需要設備的配置參數上不能太差&#xff0c;不僅是要以穩定強大輸出為基本&#xff0c;內存、音響、續航等方面也不可或缺。 直奔主題 如果你手里資金到位&#xff0c;那必須整一步到位——MacBook 對于這款大佬型筆記本…

201671010456-張瓊 實驗十四 團隊項目評審課程學習總結

博文簡要信息表 項目內容這個作業屬于哪個課程http://www.cnblogs.com/nwnu-daizh/這個作業的要求在哪里https://www.cnblogs.com/nwnu-daizh/p/11093584.html課程學習目標掌握軟件項目評審會流程&#xff0c;反思總結課程學習內容。任務一 驗收意見表GitHub倉庫地址https://gi…

強大的APIClound云修復——告別繁瑣的編譯打包流程

小編接到一項目的二期開發任務&#xff0c;拉下代碼開始熟悉大概的框架、技術、上線流程等前期工作&#xff0c;本app是通過vue技術進行開發&#xff0c;使用ui是 vant 庫&#xff0c;打包上線則是使用的 APIClound 平臺&#xff1b; 在我們的app上線后&#xff0c;如果我們改…

研究下貝塞爾曲線

今天研究了下貝塞爾曲線&#xff0c;感覺還是很有價值的。 這里貝塞爾曲線是幾個用法&#xff1a; 1.模擬曲線擬合。將折線找一個平滑的方案獲得曲線的效果。聯想可以獲知&#xff0c;可以作為工程設計的一種方式。 2.模擬拋物線和實際場景中的一些物理特性&#xff0c;即物理上…

你對ES6究竟了解多少?—— 有這一篇就夠用了

1. ES6相關概念&#xff08;★★&#xff09; 1.1 什么是ES6 ES 的全稱是 ECMAScript , 它是由 ECMA 國際標準化組織,制定的一項腳本語言的標準化規范。ES6 是ES2015以后的泛稱 1.2 為什么使用 ES6 ? 每一次標準的誕生都意味著語言的完善&#xff0c;功能的加強。JavaScrip…

科創板基礎知識

交易制度 1、上市前5個交易日不設將跌幅限制&#xff1b;其后漲跌幅限制為 20%&#xff1b; 2、單筆申報不小于 200股。 參考資料&#xff1a; 科創板圖文解讀 科創板投教長圖文系列&#xff08;四&#xff09;&#xff1a;詳解科創板股票交易的特別規定 上交所投教&#xff1a…

0_0 保留字

引自《 JavaScript 權威指南》2.4 / P28 ~ 29 保留字 部分 保留字 JavaScript 把一些標識符拿出來用作自己的關鍵字。因此&#xff0c;就不能再在程序中把這些關鍵字用作標識符了&#xff1a; 保留字 Part1.txt123456breakdelete functionreturntypeofcasedoifswitchvarc…

JavaScript 高級——詳談面向對象

1.面向過程與面向對象 1.1面向過程 面向過程就是分析出解決問題所需要的步驟&#xff0c;然后用函數把這些步驟一步一步實現&#xff0c;使用的時候再一個一個的依次調用就可以了。 1.2面向對象 面向對象是把事務分解成為一個個對象&#xff0c;然后由對象之間分工與合作。…