0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Prim算法以及優(yōu)化實(shí)現(xiàn)

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:未知 ? 作者:鄧佳佳 ? 2018-03-31 10:32 ? 次閱讀

最小生成樹(shù)(Minimum Spanning Trees),簡(jiǎn)稱(chēng)MST。是圖論中一個(gè)非常重要的概念。解決這個(gè)問(wèn)題有兩種算法,今天暫且先來(lái)討論一下Prim Algorithm。不做特別說(shuō)明,討論的都是無(wú)向圖。

首先介紹一下最小生成樹(shù)的概念,我們知道,圖可以這樣定義 G=(V,E) ,其中 G 表示圖,V 表示頂點(diǎn)集合,E 表示邊集合。最小生成樹(shù)是這樣一棵樹(shù),它滿(mǎn)足:

通俗地講,就是使得圖GG連通時(shí),所選取的邊的長(zhǎng)度的和最小。

如上圖,加粗的路徑就是在最小生成樹(shù)上的路徑。

算法講解:

現(xiàn)在,我們開(kāi)始討論P(yáng)rim Algorithm。這個(gè)算法可以分為下面幾個(gè)步驟:

將頂點(diǎn)集 V 分成兩個(gè)集合 A 和 B,其中集合 A 表示目前已經(jīng)在MST中的頂點(diǎn),而集合 B 則表示目前不在 MST 中的頂點(diǎn)。

尋找與集合 A 連通的最短的邊 (u,v),將這條邊加入最小生成樹(shù)中。(此時(shí),與(u,v) 相連的頂點(diǎn),不妨設(shè)為 Bi,也應(yīng)加入集合 A 中)重復(fù)第二步,直至集合 B 為空集。

算法的大體思想就是這樣了。為了方便理解,我們先來(lái)看一下下面一張圖片:

對(duì)照上面的圖片,想必對(duì)于Prim Algorithm也有了一定的理解。

下面我們來(lái)設(shè)計(jì)算法,顯然,我們需要遍歷集合 A 中所有頂點(diǎn)及與之相連的邊,取連接到集合B的權(quán)值最小的邊,加入最小生成樹(shù)。這樣一來(lái),復(fù)雜度將達(dá)到 O(n3)。

我們可以對(duì)這個(gè)想法進(jìn)行優(yōu)化。我們維護(hù)一 pCost[i] 數(shù)組,用來(lái)表示從集合A到與之相鄰的節(jié)點(diǎn)的最小費(fèi)用。這樣,我們只要每次取這個(gè)數(shù)組中的最小值,把它在集合B中所對(duì)應(yīng)的結(jié)點(diǎn)Vi加入到集合A中。

每次加入結(jié)束以后,都要更新pCost[i]數(shù)組。即枚舉所有與結(jié)點(diǎn)Vi相連的邊,判斷是否比pCost[i]數(shù)組中的最小費(fèi)用小,如果比它小,則更新。這樣可以將算法優(yōu)化到O(n2)。

代碼如下:

#include

#include

#include

using namespace std;

const int MAX = 1024;

const int INF = 2147483647;// 設(shè)置最大權(quán)值

int N, M;

vector > pMap[MAX];// 鄰接表

void Prim();

int main()

{

cin >> N >> M;

for(int i = 1; i <= M; i++)

{

int u, v, w;

cin >> u >> v >> w;

pMap[u].push_back(make_pair(v, w));

pMap[v].push_back(make_pair(u, w));

}

Prim();

return 0;

}

void Prim()

{

int nCost = 0;

vector pMST;// 儲(chǔ)存MST的結(jié)點(diǎn)

int pCost[MAX];// 儲(chǔ)存與集合A相鄰的頂點(diǎn)的最小權(quán)值,0表示該結(jié)點(diǎn)已經(jīng)在MST中

pMST.push_back(1);// 將結(jié)點(diǎn)1加入MST

pCost[1] = 0;

for(int i = 2; i <= N; i++)// 初始化,切記要將除1以外的都置為INF

{ pCost[i] = INF; }

for(int i = 0; i < pMap[1].size(); i++)// 處理與結(jié)點(diǎn)1相連的頂點(diǎn)

{ pCost[pMap[1][i].first] = pMap[1][i].second; }

for(int i = 1; i <= N - 1; i++)// 剩余N-1個(gè)頂點(diǎn),循環(huán)N-1次

{

int nVertex = 0, nWeight = INF;// 用于尋找最短的邊

for(int j = 1; j <= N; j++)

{

if(nWeight > pCost[j] && pCost[j] != 0)

{

nVertex = j;

nWeight = pCost[j];

}

}

pCost[nVertex] = 0;

pMST.push_back(nVertex);// 將節(jié)點(diǎn)nVertex加入MST

nCost += nWeight;// 計(jì)算MST的費(fèi)用

for(int j = 0; j < pMap[nVertex].size(); j++)// 更新pCost數(shù)組

{

if(pCost[pMap[nVertex][j].first] != 0 &&

pCost[pMap[nVertex][j].first] > pMap[nVertex][j].second)

{

pCost[pMap[nVertex][j].first] = pMap[nVertex][j].second;

}

}

}

cout << "MST Cost is " << nCost << endl;

cout << "The vertexs in MST are ";

for(int i = 0; i < pMST.size(); i++)

{ cout << pMST[i] << " "; }?

cout << endl;

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4580

    瀏覽量

    92357
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3749

    瀏覽量

    80674

原文標(biāo)題:Prim 算法及其高效實(shí)現(xiàn)

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA芯片用于神經(jīng)網(wǎng)絡(luò)算法優(yōu)化的設(shè)計(jì)實(shí)現(xiàn)方案

    前言 AI芯片(這里只談FPGA芯片用于神經(jīng)網(wǎng)絡(luò)加速)的優(yōu)化主要有三個(gè)方面:算法優(yōu)化,編譯器優(yōu)化以及硬件
    的頭像 發(fā)表于 09-29 11:36 ?4802次閱讀
    FPGA芯片用于神經(jīng)網(wǎng)絡(luò)<b class='flag-5'>算法</b><b class='flag-5'>優(yōu)化</b>的設(shè)計(jì)<b class='flag-5'>實(shí)現(xiàn)</b>方案

    定點(diǎn)算法實(shí)現(xiàn)優(yōu)化

    TDSDM642是TI公司推出的定點(diǎn)DSP芯片,具有性?xún)r(jià)比高、運(yùn)算速度快的優(yōu)點(diǎn),但是定點(diǎn)DSP對(duì)于浮點(diǎn)運(yùn)算比較困難,因此在系統(tǒng)實(shí)現(xiàn)時(shí)需要對(duì)算法進(jìn)行浮點(diǎn)到定點(diǎn)的移植。同時(shí),為了使DSP上的代碼獲得
    發(fā)表于 04-18 10:54

    【TL6748 DSP申請(qǐng)】基于DSP的目標(biāo)跟蹤算法研究及優(yōu)化實(shí)現(xiàn)

    申請(qǐng)理由:本人為北工大的研究生,專(zhuān)業(yè)為DSP與嵌入式系統(tǒng)。熟悉DSP和某些圖像算法?,F(xiàn)在課題在研究跟蹤算法以及優(yōu)化實(shí)現(xiàn),所以想申請(qǐng)次開(kāi)發(fā)板!
    發(fā)表于 09-09 16:59

    請(qǐng)問(wèn)如何實(shí)現(xiàn)優(yōu)化算法編程?

    什么是Viterbi算法?目標(biāo)處理器是什么?如何實(shí)現(xiàn)優(yōu)化算法編程?
    發(fā)表于 04-27 06:58

    粒子群算法城鎮(zhèn)能源優(yōu)化調(diào)度問(wèn)題

    computation)。源于對(duì)鳥(niǎo)群捕食的行為研究。粒子群優(yōu)化算法的基本思想:是通過(guò)群體中個(gè)體之間的協(xié)作和信息共享來(lái)尋找最優(yōu)解.PSO的優(yōu)勢(shì):在于簡(jiǎn)單容易實(shí)現(xiàn)并且沒(méi)有許多參數(shù)的調(diào)節(jié)。目前已被廣泛應(yīng)用于函數(shù)
    發(fā)表于 07-07 06:04

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)發(fā)布時(shí)間:2018-10-12 23:28,瀏覽次數(shù):1183, 標(biāo)簽:MATLAB果蠅優(yōu)化算法--Matlab
    發(fā)表于 08-17 07:28

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)過(guò)程是怎樣的?

    果蠅優(yōu)化算法MATLAB實(shí)現(xiàn)過(guò)程是怎樣的?
    發(fā)表于 11-22 07:48

    智能優(yōu)化算法及其應(yīng)用_王凌著

    本書(shū)系統(tǒng)地?cái)⑹瞿M退火算法、遺傳算法、禁忌搜索、神經(jīng)網(wǎng)絡(luò)優(yōu)化算法、混沌優(yōu)化、混合優(yōu)化策略等智能
    發(fā)表于 10-10 16:23 ?0次下載

    基于FPGA的SM3算法優(yōu)化設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGA的SM3算法優(yōu)化設(shè)計(jì)與實(shí)現(xiàn)的論文
    發(fā)表于 10-29 17:16 ?5次下載

    SVPWM算法優(yōu)化及其FPGA_CPLD實(shí)現(xiàn)

    SVPWM算法優(yōu)化及其FPGA_CPLD實(shí)現(xiàn)
    發(fā)表于 04-13 15:42 ?18次下載

    FPGA信號(hào)處理算法設(shè)計(jì)、實(shí)現(xiàn)以及優(yōu)化(南京)

    利用FPGA實(shí)現(xiàn)信號(hào)處理算法是一個(gè)難度頗高的應(yīng)用,不僅涉及到對(duì)信號(hào)處理算法、FPGA芯片和開(kāi)發(fā)工具的學(xué)習(xí),還意味著要改變傳統(tǒng)利用軟件在DSP上實(shí)現(xiàn)
    發(fā)表于 12-26 17:26 ?12次下載

    基于DM642的H.264編碼算法優(yōu)化實(shí)現(xiàn)

    基于DM642的H.264編碼算法優(yōu)化實(shí)現(xiàn)
    發(fā)表于 05-18 09:22 ?1次下載

    DM6446的車(chē)牌定位快速算法實(shí)現(xiàn)優(yōu)化

    DM6446的車(chē)牌定位快速算法實(shí)現(xiàn)優(yōu)化
    發(fā)表于 10-26 15:27 ?1次下載
    DM6446的車(chē)牌定位快速<b class='flag-5'>算法</b><b class='flag-5'>實(shí)現(xiàn)</b>與<b class='flag-5'>優(yōu)化</b>

    基于Prim初始種群選取優(yōu)化遺傳算法的三維片上網(wǎng)絡(luò)低功耗映射

    的優(yōu)勢(shì),將計(jì)算任務(wù)合理地分配到各個(gè)網(wǎng)絡(luò)節(jié)點(diǎn),對(duì)于優(yōu)化三維片上網(wǎng)絡(luò)功耗和散熱等問(wèn)題具有很高的效率。通過(guò)仿真實(shí)驗(yàn),對(duì)所提出的基于Prim算法的改進(jìn)GA與基本GA的3D NoC映射算法進(jìn)行了
    發(fā)表于 12-07 14:40 ?0次下載
    基于<b class='flag-5'>Prim</b>初始種群選取<b class='flag-5'>優(yōu)化</b>遺傳<b class='flag-5'>算法</b>的三維片上網(wǎng)絡(luò)低功耗映射

    一文詳細(xì)了解Prim最小生成樹(shù)算法

    像圖論算法這種高級(jí)算法雖然不算難,但是閱讀量普遍比較低,我本來(lái)是不想寫(xiě) Prim 算法的,但考慮到算法知識(shí)結(jié)構(gòu)的完整性,我還是想把
    的頭像 發(fā)表于 03-16 15:27 ?2787次閱讀