一步一步寫演算法(之prim演算法 上)

2021-09-06 20:10:44 字數 1251 閱讀 2751

原文:

一步一步寫演算法(之prim演算法 上)

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

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

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

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

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

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

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

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

typedef struct _dir_line

dir_line;

typedef struct _mini_generate_tree

mini_generate_tree;

b)dir_line的基本操作

status insert_line_into_queue(dir_line** ppline, int start, int end, int weight)

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最小生成樹的演算法,熟悉了基本的流程。基本上來說,我們是按照自上而下的順序來編寫 的。首先我們搭建乙個架構,然後一步一步完成其中的每乙個子功能,這樣最後構成乙個完成prim演算法計算過程。f 將dir line佇列中不符合的資料刪除,主要是雙節點都已經訪問過的dir l...

一步一步寫演算法(之prim演算法 中)

c 編寫最小生成樹,涉及建立 挑選和新增過程 mini generate tree get mini tree from graph graph pgraph mini generate tree pminitree dir line pdirline if null pgraph null pgr...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...