對圖進行深度優先搜素或者廣度優先搜尋,可以生成一顆深度優先搜尋樹或者廣度優先搜尋樹。搜尋的出發點不同,生成樹的形態也不同。
在乙個有權連通圖中,生成樹的各邊權值之和最小的那棵樹稱作最小權值生成樹,簡稱最小生成樹。
kruskal演算法是一種按照網路中各邊權值遞增順序構造最小生成樹的方法。
kruskal.cpp
//最小生成樹的貪心演算法kruskal實現
#include#include#include#includeusing namespace std;
struct edge
edge(int u0, int v0, int w0) :u(u0), v(v0), w(w0){}
};int n;//n:頂點個數
vectoredges;//edges:圖g的所有邊
int sum;//sum:最小生成樹長
vectormst;//mst:最小生成樹,用邊集表示
class disjsets
; int find(int x)//尋找點集根節點
; void unionsets(int root1, int root2)
else
};};bool cmp(const edge &lhs, const edge &rhs)
bool kruskal()
if (mst.size() == n - 1) return true;
} return false;
}int main()
} else
return 0;
}
程式執行結果如下圖所示:
參考:演算法分析與設計(c++描述) 石志國、劉冀偉、姚亦飛編著
大話資料結構 (六)最小生成樹
我們在講圖的定義和術語時,曾經提到過,乙個連通圖的生成樹是乙個極小的連通子圖,它含有圖中全部的頂點,但只有足以構成一棵樹的n 1條邊。那麼我們把構造連通網的最小代價生成樹稱為最小生成樹。在了解最小生成樹的概念之後,我們更應該看重的是如何獲取最小生成樹,並如何利用最小生成樹來解決問題。在給出prim演...
資料結構與演算法11 最小生成樹
最小生成樹 問題提出 要在n個城市間建立通訊聯絡網,城市間的通訊線路造價不同,希望找到一種方案使得建立該通訊網所需花費的總代價最小。問題分析 n個城市間,最多可設定n n 1 2條線路 n個城市間建立通訊網,至少需n 1條線路 問題轉化為 如何在可能的線路中選擇n 1條,能把所有城市 頂點 連起來,...
演算法與資料結構 最小生成樹(最小支撐樹)
概念 設g v,e 是乙個無向連通圖,生成樹上各邊的權值之和為該生成樹的代價,在g的所有生成樹中,代價最小的生成樹就稱為最小支撐樹,或稱最小生成樹。區別 最小生成樹是各邊權值和最小的數 最優歸併樹是帶權外部路徑長度最短的樹 演算法 kruskal演算法 prim演算法 來自 1 include 2 ...