采用Kruskal算法生成最小生成樹,并采用并查集的合并優化和查詢優化。

文章目錄

    • 最小生成樹
      • 1.什么是圖的最小生成樹(MST)?
      • 2.最小生成樹用來解決什么問題?
    • Kruskal(克魯斯卡爾)算法
      • 算法描述
    • 圖解

最小生成樹

1.什么是圖的最小生成樹(MST)?

用N-1條邊連接N個點,形成的圖形一定是樹。
一個具有N個點的有權無向圖,最小生成樹就是從圖的所有邊中選擇N-1條出來,連接所有的N個點。這個N-1條邊的邊權之和是所有方案中最小的。
在這里插入圖片描述

2.最小生成樹用來解決什么問題?

用來解決如何用最小的“代價”用N-1條邊連接N個點的問題。

Kruskal(克魯斯卡爾)算法

Kruskal算法是一種巧妙利用并查集來求最小生成樹的算法。
Kruskal首先初始化并查集,把N個點看做N個獨立的集合。再將所有的邊從小到大排序。然后按順序枚舉每一條邊,如果這條邊連接的兩個點屬于兩個集合,那么就把這條邊加入最小生成樹,并且合并這兩個集合;如果這條邊連接的兩個點屬于同一集合,就跳過。直到選取了N-1條邊為止。

算法描述

1.初始化計數器k=0;MST=0;(K用來記錄邊數,MST用來記錄邊的權值之和)
2.初始化并查集:Parent[x]=x;(把n個點初始化為n個獨立的集合,每個點的父節點是它自身)
3.將所有邊用Sort()從小到大排序
在這里插入圖片描述

 for(i=1;i<=M;i++){ // M為邊數,對邊進行從小到大的循環if(Find(E[i].u)!=Find(E[i].v)){ // 調用查找函數,第i條邊的端點u,第i條邊的端點v,即查詢端點u和端點v的根節點,如果根節點不相等,說明兩個點處于兩個不相同的集合之中Union(E[i].u,E[i].v);//把u,v個治所在的集合合并  // E[i]進行邊集數組儲存,表示第i條邊MST+=E[i].w; //把每條邊的邊權相加k++; //計數器 }if(K==N-1) break; //說明生成最小生成樹} 

在這里插入圖片描述

圖解

在這里插入圖片描述

//最小生成樹:Kruskal算法+邊集存儲+并查集#include<iostream>
#include<algorithm>
using namespace std;struct Edge{int u,v,w;
}E[101]; //邊集數組儲存 
int Parent[101];//并查集,定義Parent[]數組 int Find(int x) //查找根節點并壓縮路徑
{if(Parent[x]!=x)Parent[x]=Find(Parent[x]);return Parent[x]; } void Union(int x,int y){ //合并兩個集合 Parent[Find(y)]=Find(x);}int Cmp(const Edge &a,const Edge &b){ //自定義比較函數 return (a.w<b.w)?1:0; }int main(){int i,j,k=0,MST=0;int N=5,M=7;//頂點數和邊數 int e[9][3]={{1,2,2},{1,3,5},{1,4,2},{2,3,3},{3,4,1},{2,5,4},{3,5,6}};for(i=1;i<=M;i++){E[i].u=e[i-1][0];E[i].v=e[i-1][1];E[i].w=e[i-1][2];}//存邊for(i=1;i<=M;i++){Parent[i]=i; //初始化并查集} sort(E+1,E+M+1,Cmp);//調用快排序,對應的時間復雜度為O(E*logE) printf("u v w\n");for(i=1;i<=M;i++){printf("%d %d %d\n",E[i].u,E[i].v,E[i].w);//跟蹤 } //求解最小生成樹 printf("\n u v w MST\n");   //時間復雜度為O(M)或者O(E) for(i=1;i<=M;i++){if(Find(E[i].u)!=Find(E[i].v)){Union(E[i].u,E[i].v);MST+=E[i].w;k++;printf("%d %d %d %d\n",E[i].u,E[i].v,E[i].w,MST);//跟蹤}if(k==N-1) {break;} }printf("\n MST=%d\n",MST);} 

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

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

相關文章

Java操作HBase

rowkey查詢 //根據rowKey進行查詢public static User getDataByRowKey(String tableName, String rowKey,String password) throws IOException {Admin admin connection.getAdmin();Table table connection.getTable(TableName.valueOf(tableName));Get get new Get(rowKe…

Java連接Mysql數據庫(JDBC)

文章目錄導入包con、stmt、rs 三者存在一定的關系getInt和getStringinput.nextInt();簡單使用講解ResultSet和StatementPreparedStatement的用法JDBC連接代碼更多樣例導入包 import java.sql.Connection; import java.sql.DriverManager; import java.sql.statement; import j…

JavaBean和Servlet

文章目錄JavaBean通俗的講JavaBean的作用JavaBean&#xff08;就是一個Java類&#xff09;的定義使用層面&#xff0c;Java分為2大類&#xff1a;Servlet回顧純手工方法創建第一個Servlet借助于Eclipse快速生成ServletServlet3.0&#xff0c;與Servlet2.5的區別&#xff1a;項目…

Linux編程考前測試題

文章目錄選擇題多選題判斷題填空題簡答題編程題選擇題 1:當打開vi文本編輯器編輯文件時&#xff0c;vi處于&#xff08;A&#xff09;模式 A: 命令模式 B: 編輯模式 C: 實模式 D: 虛模式 2:下列有關fork&#xff08;&#xff09;函數返回值說法錯誤的是&#xff08;D&#xf…

MySQL考試復習(知識點、練習題)

文章目錄數據庫的管理技術的三個階段發展的三個階段數據庫的鎖數據庫設計的基本步驟事務的四大特性什么是視圖如果關系模式設計不好&#xff0c;可能帶來哪幾個問題數據庫管理系統的主要功能有哪些數據庫系統中的常見故障有哪些簡述SQL語言的組成說明關系模型有哪三類完整性規則…

Oracle復習(知識點、練習題、實驗)

文章目錄第一章 數據庫概念數據庫的三級模式結構&#xff1a;模式、外模式、內模式三級模式之間的映射第二章 Oracle12g體系結構Oracle的邏輯存儲結構Oracle物理存儲結構Oracle11g服務器結構系統全局區&#xff08;SGA&#xff09;程序全局區&#xff08;PGA&#xff09;第三章…

Openstack面試題和知識點總結

文章目錄知識點云計算起源定義特點分類服務類型平臺分類應用虛擬化虛擬化技術定義分類云計算和虛擬化的關系虛擬化的優點OpenStack簡介核心架構Openstack組件共享服務組件核心組件組件詳解RabbitMQ概念特點rabbitmq中的概念工作原理常用操作MemcachedKeystoneGlance工作原理Nov…

實例化一個對象

類實例化就是新建一個類的對象&#xff0c;就是new一個對象 類名 對象名 new 類名&#xff08;&#xff09;;例子&#xff1a;Student stu new Student&#xff08;&#xff09;; 注意&#xff1a; 類在沒有實例化之前,就是new之前,它的屬性,方法等等在內存中都是不存在的.…

RuntimeException:java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not fonud

在hadoop上運行Mapreduce項目jar包報錯&#xff1a; Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not foundat org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2638)at org.apache.hadoop.ma…

auto.js 實現信息發送、QQ點贊、微信點贊、健康日報簽到

文章目錄auto.js開發文檔安裝total control在手機端安裝auto.js apk安裝vscode短信多條發送QQ點贊微信點贊健康日報填寫疊貓貓auto.js開發文檔 點擊學習 安裝total control total control 用于手機投屏在電腦屏幕上 在手機端安裝auto.js apk 鏈接&#xff1a;https://pan.…

MapReduce綜合學習含Wordcount案例

文章目錄MapReduce簡介MapTaskReduceTaskMapper階段解讀Reducer階段解讀MapReduce適用的問題MapReduce的特點MapReduce基本思想大數據處理思想&#xff1a;分而治之構建抽象模型&#xff1a;Map 函數和 Reduce 函數上升到架構&#xff1a;并行自動化并隱藏底層細節MapReduce計算…

基于Spring boot+Vue的在線考試系統

文章目錄spring boot 分層圖解安裝idea配置阿里云鏡像項目啟動前端項目結構項目前端中index.htmlApp.vuemain.jsrouter整個頁面渲染過程關于矢量圖圖標的使用引入JQuery依賴github-markdown-css樣式文件-一般用作文章正文的樣式美化spring boot 分層圖解 安裝idea 安裝參考 id…

Java基礎總結之(面試)

文章目錄Java標識符Java修飾符訪問權限修飾符訪問控制和繼承非訪問權限修飾符局部變量修飾符接口接口中方法修飾符運算符算術運算符一元運算符二元運算符算術賦值運算符賦值運算符邏輯運算符&#xff08;&&、||和!&#xff09;關系運算符自增和自減運算符&#xff08;和…

Javaweb練手項目

文章目錄學生管理系統音樂網站鋒芒博客中醫藥管理系統博客天梯CMS系統鋒芒社團官網學生管理系統 實現技術&#xff1a;ServletMVC&#xff08;模式&#xff09;Filter(過濾器&#xff09;html 主要功能&#xff1a;學生信息的增刪查改&#xff0c;文件&#xff08;圖片&#x…

Spark之scala學習(基礎篇)待更新

文章目錄引言大數據介紹大數據與云計算區別大數據和人工智能的區別大數據和傳統的分析&#xff08;excel&#xff09;的區別scala的特性面向對象特性函數式編程函數式編程的特點&#xff1a;函數式編程的優勢靜態類型擴展性并發性為什么要學scalascala安裝簡單測試了解ScalaSca…

Jupyter Notebook的安裝及問題解決方案

文章目錄下載并安裝Anaconda3更改主界面路徑但是如果沒有jupyter_notebook_config.py文件怎么辦&#xff1f;如果更改過路徑后&#xff0c;不生效怎么辦&#xff1f;使用參考pycharm導入pyspark下載并安裝Anaconda3 官網下載個人版 Anaconda3安裝參考 點擊&#xff0c;然后進…

airodump-ng wlan0mon掃描不到網絡_MySQL ProxySql 由于漏洞掃描導致的 PROXYSQL CPU 超高...

ProxySQL 本身是一款非常棒的MYSQL 中間件的開源產品, 在公司運行了一段時間后,突然一天報警,所在機器的CPU 出奇的高,之前在測試系統, 預生產, 以及生產系統均沒有出現問題. 開始未來緊急解決問題,重新啟動了proxysql服務,并查看錯誤日志.PROXYSQL 的系統版本的2.012 MYSQL 的…

網絡安全之SQL注入

文章目錄SQL注入的定義SQL注入為什么會成功&#xff1f;為什么發生SQL注入&#xff1f;SQL注入的分析SQL的注入流程判斷SQL注入點判斷注入類型SQL注入的通常方法防止SQL注入SQL注入的定義 SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串&#xff0c…

4個空格和一個tab有什么區別_火花塞為什么一換就是4個?只換一個不行嗎?

火花塞不是一個經常被提及的配件&#xff0c;但如果火花塞老化&#xff0c;車輛的整體性能將受到影響&#xff0c;更換火花塞其實也是日常保養的一部分&#xff0c;就像換機油和三濾一樣。不知道大家是否注意到&#xff0c;在做完保養之后&#xff0c;維修師傅會幫你檢查一下火…

小型云臺用的是什么電機_直流電機的工作原理是什么?未來的電動車都會用直流電機嗎?...

說起直流電機&#xff0c;其實我們每個人&#xff0c;每天都在用。是嗎&#xff1f;別驚訝&#xff0c;是的。手機&#xff0c;我們每天都在用&#xff0c;有消息或者有電話時&#xff0c;手機就開始振動。這個振動就是用直流電機來實現的。當然&#xff0c;直流電機在其他領域…