最小生成樹詳解

注:本文算法使用鏈式前向星數據結構實現。學習鏈接:鏈式前向星-學習筆記

一、Prim算法

普通prim算法模板:

//用前向星錄數據的時候記得把head初始化為-1 
fill(dist,dist+LEN,MAX);
memset(vis,0,sizeof vis);
int ans=0;
dist[1]=0;        //如果題目要求輸出最小生成樹,就把題目要求的源點s的dist設為0 
while(1){        //如果題目要求判斷最小生成樹是否能覆蓋所有邊,這個循環條件應該是i=n;while(n--)循環n次。 int u=-1,d=MAX;for(i=1;i<=N;i++){if(!vis[i] && dist[i]<d){u=i;d=dist[i];}}if(u<0) break;    //如果題目要求判斷最小生成樹是否能覆蓋所有邊,出現這樣的情況說明不能覆蓋所有邊。 vis[u]=1;ans+=dist[u];for(i=head[u];~i;i=mp[i].next){    //用前向星遍歷u點所有的后繼。i是各個后繼點在mp的下標,mp[to]是u的各個后繼點 int to=mp[i].to;if(!vis[to] && mp[i].w<dist[to]){//如果這個點沒有被訪問過、并且u->v的路徑比點集S到v的路徑要短,則更新。 dist[to]=mp[i].w;}}
}
O("%d\n",ans);

堆優化的prim算法:

堆結構:

struct cmp{bool operator () (int a,int b){return dist[a]>dist[b];}
}; 
priority_queue<int,vector<int>,cmp> pq;

算法代碼:

int ans=0;
dist[1]=0;
pq.push(1);
while(!pq.empty()){int u=pq.top();pq.pop();if(vis[u]) continue;vis[u]=1;ans+=dist[u];for(i=head[u];~i;i=mp[i].next){int to=mp[i].to;if(!vis[to] && mp[i].w<dist[to]){dist[to]=mp[i].w;pq.push(to);}}
}
O("%d\n",ans);

?

二、Kruskal算法

1.建立邊表數據結構

typedef struct edge{int u,v,w;edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){}bool operator < (const edge& obj) const{return w<obj.w;}
}edge;
edge mp[LEN*LEN];

2.編寫并查集模板(以下代碼沒有寫合并的Union操作。這個操作在主代碼執行的時候已經實現)

int fa[LEN];
int init(){int i;FF(i,LEN) fa[i]=i;
}
int findFa(int x){if(x==fa[x]) return x;int r=x;while(r!=fa[r]){r=fa[r];}int t=x;while(x!=fa[x]){t=fa[x];fa[x]=r;x=t;}return r;
}

3.編寫主代碼

sort(mp,mp+cnt);
FF(i,cnt){int fa_u=findFa(mp[i].u);int fa_v=findFa(mp[i].v);if(fa_u!=fa_v){ans+=mp[i].w;fa[fa_u]=fa_v;edge_cnt++;if(edge_cnt>=N-1) break;}
}
O("%d\n",ans);

注意:

①邊表的范圍要開大,因為邊的數目可能是頂點數目的平方(準確說,有向圖邊樹E=N*(N-1) )

②Prim算法在錄邊的數據的時候,因為是無向圖,一條邊要錄成兩條。Kruskal就沒有這種必要了。

③各種初始化代碼(比如并查集的init() )要注意加上。

?

打個OJ測試一下吧!

OJ鏈接:還是暢通工程

AC代碼:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 1010
#define MAX (1<<30)-1
#define V vector<int>using namespace std;int N;
int fa[LEN];
int init(){int i;FF(i,LEN) fa[i]=i;
}
int findFa(int x){if(x==fa[x]) return x;int r=x;while(r!=fa[r]){r=fa[r];}int t=x;while(x!=fa[x]){t=fa[x];fa[x]=r;x=t;}return r;
}typedef struct edge{int u,v,w;edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){}bool operator < (const edge& obj) const{return w<obj.w;}
}edge;
edge mp[LEN*LEN];
int cnt=0;int main(){
//    freopen("還是暢通工程.txt","r",stdin);int i,j,u,v,w;while(scanf("%d",&N),N){init();cnt=0;int ans=0;int edge_cnt=0;i=(N*(N-1))/2;while(i--){I("%d%d%d",&u,&v,&w);mp[cnt++]=edge(u,v,w);
//            mp[cnt++]=edge(v,u,w);
        }sort(mp,mp+cnt);FF(i,cnt){int fa_u=findFa(mp[i].u);int fa_v=findFa(mp[i].v);if(fa_u!=fa_v){ans+=mp[i].w;fa[fa_u]=fa_v;edge_cnt++;if(edge_cnt>=N-1) break;}}O("%d\n",ans);}return 0;
}
View Code

?

轉載于:https://www.cnblogs.com/TQCAI/p/8549353.html

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

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

相關文章

dropbox文件_Dropbox即將發布的擴展程序更新將添加更多文件編輯支持,包括Pixlr照片...

dropbox文件Dropbox is perhaps the best-known cloud storage platform for consumers, but it’s hoping to become something more. With an upcoming overhaul to its user tools, Dropbox will add more complex editing tools, in addition to what it already provides …

黑客竊取思科、IBM與甲骨文認證管理系統內的敏感數據

目前一套被思科、F5、IBM以及甲骨文等企業所廣泛使用的認證管理系統(即Credential Manager System)正面臨著數據泄露風險&#xff0c;其中的敏感數據也許已經被黑客們所獲取。 根據Pearson VUE(主營計算機測試方案開發與交付)發布的一項公告&#xff0c;某惡意軟件已經藏身于該…

Spring下載地址

下載地址&#xff1a;https://repo.spring.io/libs-release-local/org/springframework/spring/ 進入后可選擇下載版本&#xff0c;選擇版本后&#xff0c;進入目錄結構。其中dist是最終發布版本&#xff0c;包含開發所需lib和源碼。docs是開發文檔。schema是一些約束文件。 Do…

C#字符串:轉數組、數字

1.List<string> 轉數組&#xff0c;字符串 string[] strs list.ToArray();string s string.Join(",", list.ToArray());//數組轉list string[] strArr new string[3] { "1", "2", "3" }; List<string> strList strArr…

.NET7發布,一大批優秀.NET6項目沒人看了嗎...(都是好項目)

恍惚間都已經.NET7.0了&#xff0c;不能再呆在舊版本了&#xff01;這里分享一套Vue3 Axios TS Vite Element Plus .NET 6 WebAPI JWT SqlSugar的通用管理后臺&#xff0c;各種最新框架組件&#xff0c;學習必備&#xff01;這里把源碼、腳本以及專門錄制的視頻教程都打…

Python的日志記錄-logging模塊的使用

一、日志 1.1什么是日志 日志是跟蹤軟件運行時所發生的事件的一種方法&#xff0c;軟件開發者在代碼中調用日志函數&#xff0c;表明發生了特定的事件&#xff0c;事件由描述性消息描述&#xff0c;同時還包含事件的重要性&#xff0c;重要性也稱為級別或嚴重性。 1.2何時使用日…

詢問HTG:白噪聲屏幕保護程序,有效的文件命名以及從密碼泄露中恢復

Once a week we share three of the questions we’ve answered from the Ask HTG inbox with the greater readership; this week we’re looking at white noise screen savers, efficient file naming systems, and recovering from a password compromise. 每周一次&#…

專家預測第二波WannaCry勒索病毒攻擊即將到來!

WannaCry的傳播腳步今晨戛然而止 今天一大早&#xff0c;全網的WannaCry蠕蟲病毒攻擊突然減弱消退了!所有這一切功勞來自于英國研究人員malwaretech&#xff0c;他通過逆向發現WannaCry代碼中有一個特殊域名地址&#xff1a; www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.co…

01.HTML基礎命令筆記

目錄 HTML結構 body內常用標簽 常用 div與span img a標簽 超鏈接標簽 其他格式標簽 列表 表格 表單 select標簽 label標簽 textarea多行文本 HTML結構 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"&…

ios numlock_從“提示”框:默認情況下啟用NumLock,無廣告的iOS應用和立體聲供電的派對燈...

ios numlockOnce a week we round up some of the great tips readers have sent into the tip box. This week we’re looking at how to enable the NumLock by default, stripping ads from iOS apps, and turning Christmas lights into audio-responsive party lights. 每…

Windows 7 自動更新失敗導致無法進系統解決方案

故障現象&#xff1a;自動更新后&#xff0c;重啟電腦&#xff0c;提示&#xff1a;&#xff08;配置Windows update 失敗 還原更改 請勿關閉計算機&#xff09;&#xff0c; 而計算機一直停留該界面&#xff0c;如果半個小時以上都無反應。此時&#xff0c;就不要再繼續等待了…

Net程序員為什么要學點其他語言副業

最近看了很多同行的文章、或者是現實中身邊的例子也好&#xff0c;真的覺得大家太不容易了。感覺說的就是自己。入門上學的時候接觸了.NET&#xff0c;它的簡單以及宇宙無敵的Visual Studio&#xff0c;讓我深深地迷戀上它。畢業之后&#xff0c;就成功的做來一名.Neter&#x…

PaperWeekly 第28期 | 圖像語義分割之特征整合和結構預測

“ 余昌黔 華中科技大學碩士 研究方向為圖像語義分割 知乎專欄 https://zhuanlan.zhihu.com/semantic-segmentation 前言 近來閱讀了 PASCAL VOC 2012 排行榜上前幾的文章&#xff0c;包括 PSPNet 和林國省老師的幾篇論文&#xff0c;覺得現在在 semantic segmentation 領域對于…

POJ.2774.Long Long Message/SPOJ.1811.LCS(后綴數組 倍增)

題目鏈接 POJ2774SPOJ1811 LCS - Longest Common Substring 比后綴自動機慢好多(廢話→_→)。 \(Description\) 求兩個字符串最長公共子串 \(Solution\) 任何一個子串一定是某個后綴的前綴 可以將兩個字符串拼在一起&#xff0c;中間用一個從未出現過的字符隔開&#xff0c;這樣…

02.CSS基礎筆記及導入

CSS是什么 CSS&#xff08;Cascading Style Sheet&#xff0c;層疊樣式表)定義如何顯示HTML元素。 當瀏覽器讀到一個樣式表&#xff0c;它就會按照這個樣式表來對文檔進行格式化&#xff08;渲染&#xff09;。 CSS樣式 CSS引入HTML 內部樣式與外部樣式 <!DOCTYPE> …

如何還原桌面圖標_如何為Windows 10桌面圖標還原或更改文本的默認外觀?

如何還原桌面圖標For whatever reason, sooner or later we all have someone or something mess around with our keyboards and create ‘interesting’ results. With that in mind, today’s SuperUser Q&A post has a simple and elegant way to help a frustrated re…

「前端早讀君007」css進階之徹底理解視覺格式化模型

今日勵志 不論你在什么時候開始&#xff0c;重要的是開始之后不要停止。 前言 對于部分前端工程師來講&#xff0c;有時候CSS令他們很頭疼&#xff0c;明明設置了某個樣式&#xff0c;但是布局就是不起作用。 如果你也有這種問題&#xff0c;那么是時候學習下什么是css視覺格式…

.NET周報【11月第3期 2022-11-22】

國內文章.NET Conf China 2022 第一批講師陣容大揭秘&#xff01;整個期待了&#xff01;https://mp.weixin.qq.com/s/4p89hhBPw6qv-0OB_T_TOg目光看過來 2022 年 12 月 3-4 日&#xff0c;一場社區性質的國內規模最大的 線上線下.NET Conf 2022 技術大會 即將盛大開幕。目前大…

解讀Facebook CAN:如何給人工智能賦予藝術創作的力量

雷鋒網 AI 科技評論按&#xff1a;能夠迭代進化、模仿指定數據特征的GAN&#xff08;生成式對抗性網絡&#xff09;已經是公認的處理圖像生成問題的好方法&#xff0c;自從提出以來相關的研究成果不少&#xff0c;在圖像增強、超分辨率、風格轉換任務中的效果可謂是驚人的。 &a…

全向輪底盤磁導軌尋跡

全向輪底盤上安裝兩條磁傳感器帶用于磁導軌尋跡 如簡圖所示&#xff0c;兩條與Y直線相交的黑色線條我們認為是兩條磁檢測傳感器帶 矢量方法修正車體位置 定義軌道左為負向&#xff0c;軌道右為正向。傳感器左檢測為負&#xff0c;右檢測為正&#xff1b; 定義底盤坐標系為αβ&…