原文:
一步一步寫演算法(之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條,這條路徑都可以達到目的地,然而我們在挑選...