prim演算法的實現過程

2021-07-12 00:05:39 字數 2610 閱讀 3650

為什麼要構建最小生成樹呢?其實原理很簡單。打個比方,現在某乙個鄉鎮有n個村,那麼這n個村肯定是聯通的。現在我們打算在各個村之間搭建網線,實現村村通的工程。那麼有什麼辦法可以實現村村互通,同時又使得最後的總距離最小呢?要達到這個目的,就必須在已有的圖中構建最小生成樹。

生成最小生成樹的方法很多,prim方法就是其中的一種。那麼生成最小生成樹的基本步驟是什麼呢?很簡單,聽我慢慢道來:

1)以某乙個點開始,尋找當前該點可以訪問的所有的邊;

2)在已經尋找的邊中發現最小邊,這個邊必須有乙個點還沒有訪問過,將還沒有訪問的點加入我們的集合,記錄新增的邊;

3)尋找當前集合可以訪問的所有邊,重複2的過程,直到沒有新的點可以加入;

4)此時由所有邊構成的樹即為最小生成樹。

a)首先,我們定義基本的資料結構。

[cpp]view plain

copy

typedef

struct

_dir_line  

dir_line;  

typedef

struct

_mini_generate_tree  

mini_generate_tree;  

b)dir_line的基本操作

[cpp]view plain

copy

status insert_line_into_queue(dir_line** ppline, 

intstart, 

intend, 

intweight)  

pline = create_new_dir_line(start, end, weight);  

pline->next = *ppline;  

*ppline = pline;  

return

true;  

}  status delete_line_from_queue(dir_line** ppline, dir_line* pline)  

prev = *ppline;  

while

(pline != prev->next)  

prev = prev->next;  

prev->next = pline->next;  

final:  

free(pline);  

return

true;  

}  

前面我們討論了圖的建立、新增、刪除和儲存等問題。今天我們將繼續討論圖的一些其他問題,比如說如何在圖的環境下構建最小生成樹。為什麼要構建最小生成樹呢?其實原理很簡單。打個比方,現在某乙個鄉鎮有n個村,那麼這n個村肯定是聯通的。現在我們打算在各個村之間搭建網線,實現村村通的工程。那麼有什麼辦法可以實現村村互通,同時又使得最後的總距離最小呢?要達到這個目的,就必須在已有的圖中構建最小生成樹。

生成最小生成樹的方法很多,prim方法就是其中的一種。那麼生成最小生成樹的基本步驟是什麼呢?很簡單,聽我慢慢道來:

1)以某乙個點開始,尋找當前該點可以訪問的所有的邊;

2)在已經尋找的邊中發現最小邊,這個邊必須有乙個點還沒有訪問過,將還沒有訪問的點加入我們的集合,記錄新增的邊;

3)尋找當前集合可以訪問的所有邊,重複2的過程,直到沒有新的點可以加入;

4)此時由所有邊構成的樹即為最小生成樹。

那麼,**應該怎麼編寫呢?朋友們可以自己好好思考一下。

a)首先,我們定義基本的資料結構。

[cpp]view plain

copy

typedef

struct

_dir_line  

dir_line;  

typedef

struct

_mini_generate_tree  

mini_generate_tree;  

b)dir_line的基本操作

[cpp]view plain

copy

status insert_line_into_queue(dir_line** ppline, 

intstart, 

intend, 

intweight)  

pline = create_new_dir_line(start, end, weight);  

pline->next = *ppline;  

*ppline = pline;  

return

true;  

}  status delete_line_from_queue(dir_line** ppline, dir_line* pline)  

prev = *ppline;  

while

(pline != prev->next)  

prev = prev->next;  

prev->next = pline->next;  

final:  

free(pline);  

return

true;  

}  

Prim 演算法的實現

最小生成樹除了prim還有kruskal演算法。prim演算法的實現,用到了優先佇列。include include include include include include include include include using namespace std 邊表 class edgeno...

prim演算法的實現

新增鏈結描述 執行了一下prim 演算法 覺得這個程式還可以 後期可以在此基礎上做較大的改動 故此分享了這個 include define maxvex 10 define true 1 define false 0 define inf 65535 此處是權值極大值 define length a...

Prim演算法實現

include stdio.h define max vertex num 20 typedef struct arccellarccell,adjmatrix max vertex num max vertex num typedef struct mgraph struct closedge m...