吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Prim算法以及優化實現

算法與數據結構 ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-31 10:32 ? 次閱讀

最小生成樹(Minimum Spanning Trees),簡稱MST。是圖論中一個非常重要的概念。解決這個問題有兩種算法,今天暫且先來討論一下Prim Algorithm。不做特別說明,討論的都是無向圖。

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

通俗地講,就是使得圖GG連通時,所選取的邊的長度的和最小。

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

算法講解:

現在,我們開始討論Prim Algorithm。這個算法可以分為下面幾個步驟:

將頂點集 V 分成兩個集合 A 和 B,其中集合 A 表示目前已經在MST中的頂點,而集合 B 則表示目前不在 MST 中的頂點。

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

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

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

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

我們可以對這個想法進行優化。我們維護一 pCost[i] 數組,用來表示從集合A到與之相鄰的節點的最小費用。這樣,我們只要每次取這個數組中的最小值,把它在集合B中所對應的結點Vi加入到集合A中。

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

代碼如下:

#include

#include

#include

using namespace std;

const int MAX = 1024;

const int INF = 2147483647;// 設置最大權值

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;// 儲存MST的結點

int pCost[MAX];// 儲存與集合A相鄰的頂點的最小權值,0表示該結點已經在MST中

pMST.push_back(1);// 將結點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++)// 處理與結點1相連的頂點

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

for(int i = 1; i <= N - 1; i++)// 剩余N-1個頂點,循環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);// 將節點nVertex加入MST

nCost += nWeight;// 計算MST的費用

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

{

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;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4630

    瀏覽量

    93359
  • 程序
    +關注

    關注

    117

    文章

    3796

    瀏覽量

    81416

原文標題:Prim 算法及其高效實現

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA芯片用于神經網絡算法優化的設計實現方案

    前言 AI芯片(這里只談FPGA芯片用于神經網絡加速)的優化主要有三個方面:算法優化,編譯器優化以及硬件
    的頭像 發表于 09-29 11:36 ?4983次閱讀
    FPGA芯片用于神經網絡<b class='flag-5'>算法</b><b class='flag-5'>優化</b>的設計<b class='flag-5'>實現</b>方案

    定點算法實現優化

    TDSDM642是TI公司推出的定點DSP芯片,具有性價比高、運算速度快的優點,但是定點DSP對于浮點運算比較困難,因此在系統實現時需要對算法進行浮點到定點的移植。同時,為了使DSP上的代碼獲得
    發表于 04-18 10:54

    【TL6748 DSP申請】基于DSP的目標跟蹤算法研究及優化實現

    申請理由:本人為北工大的研究生,專業為DSP與嵌入式系統。熟悉DSP和某些圖像算法。現在課題在研究跟蹤算法以及優化實現,所以想申請次開發板!
    發表于 09-09 16:59

    請問如何實現優化算法編程?

    什么是Viterbi算法?目標處理器是什么?如何實現優化算法編程?
    發表于 04-27 06:58

    粒子群算法城鎮能源優化調度問題

    computation)。源于對鳥群捕食的行為研究。粒子群優化算法的基本思想:是通過群體中個體之間的協作和信息共享來尋找最優解.PSO的優勢:在于簡單容易實現并且沒有許多參數的調節。目前已被廣泛應用于函數
    發表于 07-07 06:04

    果蠅優化算法MATLAB實現

    果蠅優化算法MATLAB實現發布時間:2018-10-12 23:28,瀏覽次數:1183, 標簽:MATLAB果蠅優化算法--Matlab
    發表于 08-17 07:28

    果蠅優化算法MATLAB實現過程是怎樣的?

    果蠅優化算法MATLAB實現過程是怎樣的?
    發表于 11-22 07:48

    智能優化算法及其應用_王凌著

    本書系統地敘述模擬退火算法、遺傳算法、禁忌搜索、神經網絡優化算法、混沌優化、混合優化策略等智能
    發表于 10-10 16:23 ?0次下載

    基于FPGA的SM3算法優化設計與實現

    基于FPGA的SM3算法優化設計與實現的論文
    發表于 10-29 17:16 ?5次下載

    SVPWM算法優化及其FPGA_CPLD實現

    SVPWM算法優化及其FPGA_CPLD實現
    發表于 04-13 15:42 ?18次下載

    FPGA信號處理算法設計、實現以及優化(南京)

    利用FPGA實現信號處理算法是一個難度頗高的應用,不僅涉及到對信號處理算法、FPGA芯片和開發工具的學習,還意味著要改變傳統利用軟件在DSP上實現
    發表于 12-26 17:26 ?12次下載

    基于DM642的H.264編碼算法優化實現

    基于DM642的H.264編碼算法優化實現
    發表于 05-18 09:22 ?1次下載

    DM6446的車牌定位快速算法實現優化

    DM6446的車牌定位快速算法實現優化
    發表于 10-26 15:27 ?1次下載
    DM6446的車牌定位快速<b class='flag-5'>算法</b><b class='flag-5'>實現</b>與<b class='flag-5'>優化</b>

    基于Prim初始種群選取優化遺傳算法的三維片上網絡低功耗映射

    的優勢,將計算任務合理地分配到各個網絡節點,對于優化三維片上網絡功耗和散熱等問題具有很高的效率。通過仿真實驗,對所提出的基于Prim算法的改進GA與基本GA的3D NoC映射算法進行了
    發表于 12-07 14:40 ?0次下載
    基于<b class='flag-5'>Prim</b>初始種群選取<b class='flag-5'>優化</b>遺傳<b class='flag-5'>算法</b>的三維片上網絡低功耗映射

    一文詳細了解Prim最小生成樹算法

    像圖論算法這種高級算法雖然不算難,但是閱讀量普遍比較低,我本來是不想寫 Prim 算法的,但考慮到算法知識結構的完整性,我還是想把
    的頭像 發表于 03-16 15:27 ?2981次閱讀
    累积式百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城网址是什么| 大发888信用| 百家乐官网免费是玩| 大发888 赌博网站大全| 百家乐官网已破解的书籍| 百家乐赌博出千| 百家乐小路规则| 金尊国际娱乐城| 银泰百家乐官网龙虎斗| 百家乐榄梯打法| 大发888官网吧| 足球百家乐官网投注| 网上百家乐的打法| 网上百家| 澳门百家乐官网论坛及玩法| 新东泰百家乐的玩法技巧和规则| 足球赛事直播| 至尊百家乐官网网| 百家乐上海代理| 台安县| 百家乐线上真人游戏| 博客国际娱乐| 百家乐好不好玩| 金贊娱乐城| 百家乐电脑上怎么赌| 沁水县| 香港百家乐赌场| 百家乐官网软件官方| 百家乐揽法大全| 姚安县| 百家乐视频地主| 3d俄罗斯轮盘| 百家乐波音平台导航网| 尊龙国际娱乐| 澳门百家乐皇冠网| 瑞丰国际开户| 娱乐百家乐官网下载| 太子娛樂城网址| e世博百家乐攻略| 百家乐官网的胜算法|