最小生成樹

2021-06-23 01:30:26 字數 2165 閱讀 3568

求最小生成樹是指找出覆蓋圖中所有點的邊集(生成樹)中,所有邊權之和最小的乙個。常用的演算法有prim演算法和kruskal演算法;基本上都是貪心的思想,prim演算法類似於dijkstra演算法。

prim()演算法:時間複雜度為v^2(v為節點數數目),適用於稠密圖,當用優先佇列優化時,時間複雜度為e*log(v)(e為邊的數目),適用於稀疏圖。prim的思想是:初始化最小生成樹集合為空,任取一點為最小生成樹根節點,加入最小生成樹集合,不斷的往已經生成最小生成樹中加節點(原則是與1、加入當前與已生成的最小生成樹集合相連;2、沒有被加入集合中,3、滿足以上兩個條件的最短邊)迴圈操作,知道所有點都加入生成樹集合中;

kruskal演算法:時間複雜度為e*log(e)(e為邊數)。kruskal演算法的思想是:將圖中的邊權值按照從小到大排序,如果選出的邊不能使當前已經確定的最小生成樹部分形成迴路(使用並查集判斷),則其可以為最小生成樹的部分加入集合,否則捨去,至到加入了n-1條邊為止。

最小生成樹的性質:

(1)、最小生成樹的最長k-1條邊都去掉後,正好將原圖分成了k個連通分支。

(2)、乙個圖的兩棵最小生成樹,邊的權值序列排序後結果相同。

poj1258最小生成樹模板題目,由於資料比較小,prim和kruskal都可以做;

prim演算法(臨接矩陣存圖);

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define max 110

#define inf 2000000000

#define eps 1e-8

using namespace std;

int a[max][max],n;

int prim(int s);

struct node

};vectorg[max]; //記錄與節點i相連的邊的編號

vectoredges; //給邊編號,並儲存

int n,vis[max],d[max];

void init()

void addedge(int from, int to, int dist));

int k = edges.size();

g[from].push_back(k-1);

}int prim(int s));

for (int i=0; i<=n; i++) d[i] = (i == s ? 0 : inf);

while (!q.empty());

struct node

};int first[max],next[max];

vectoredges;

void init()

void addedge(int from, int to, int dist));

int k = edges.size();

next[k-1] = first[from];

first[from] = k-1;

}int n;

int prim(int s)

void init()

}int find(int x)

int kruskal() }}

int main()

struct edge;

struct node

};vectorg[max];

vectoredges;

int n,s,vis[max];

void init()

void addedge(int from, int to, double dist));

int k = edges.size();

g[from].push_back(k-1);

}double prim(int s));

for (int i=0; i<=n; i++) d[i] = (i == s ? 0 : inf);

while (!q.empty()){

node t = q.top();

q.pop();

if (vis[t.u]) continue;

vis[t.u] = 1;

ans[cnt++] = t.w;

int v = t.u;

for (int i=0; i

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...