最小生成樹

2022-08-27 08:27:11 字數 4081 閱讀 4387

1.kruskal演算法

a表示最小生成樹所有邊的集合.

思路:將所有邊按照權重從小到大排序,依次從中選擇最小的邊,若邊的兩個結點不在同一棵樹中,就將這條邊加入a.

偽**:

kruskal(g,w)

a =∅

for each vertex v in

g.v make-set(v)//

為每個結點建一棵樹

sort g.e into nondecreasing by weight

for each edge(u,v) in

g.e

if find-set(u) ≠ find-set(v)

a =a∪

union(u,v)

//將u,v所在的樹合併成一棵樹

return a

時間複雜度:o(|e|lg|e|),又|e|o(|e|lg|v|)

編碼實現:

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 10000

enum

color;

class

node

};class

vnode

};typedef

struct

graphgraph;

class

edge

};bool

cmp(edge a,edge b)

vector

kruskal(const graph &g,vector&w)

sort(w.begin(),w.end(),cmp);

for(int i=0;i)

}//s[w[i].v] = s[w[i].u];

} }

returna;}

void addedge(graph &g,int i,int

j)int

main();

for(int i=0;i)

addedge(g,

0,1);

addedge(g,

0,2);

addedge(g,

0,3);

addedge(g,

1,2);

addedge(g,

1,4);

addedge(g,

2,3);

addedge(g,

2,4);

addedge(g,

2,5);

addedge(g,

3,5);

addedge(g,

4,5);

vector

w;//

w中儲存了所有邊

w.push_back(edge(0,1,6

)); w.push_back(edge(

0,2,1

)); w.push_back(edge(

0,3,5

)); w.push_back(edge(

1,2,5

)); w.push_back(edge(

1,4,3

)); w.push_back(edge(

2,3,5

)); w.push_back(edge(

2,4,6

)); w.push_back(edge(

2,5,4

)); w.push_back(edge(

3,5,2

)); w.push_back(edge(

4,5,6

)); vector

a; a=kruskal(g,w);

for(auto e:a)

return0;

}

view code

2.prim演算法

a表示最小生成樹所有結點的集合.

思路:初始時選擇乙個根結點r,其餘結點到r的距離初始化為max,將所有結點都壓入最小優先佇列q,選擇q中到a最近的點加入a,重新計算q中結點到a的距離,直到所有結點都加入a(即q為空).

偽**:

prim(g,w,r)

for each u in

g.v u.key =max

u.p =nil

r.key = 0

q = g.v//

q是以結點到a的距離為priority的最小優先佇列

while

q ≠ ∅

u = extract-min(q)

for each v in

g.adj[u]

if v in q and w[u][v]

v.p =u

v.key = w[u][v]

最小生成樹是a = }

時間複雜度:o(|e|lg|v|)

編碼實現:

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 10000

enum

color;

class

node

};class

vnode

};class

graph;

struct

comp

};bool belongq(priority_queue,comp> q,int

v) }

return

false;}

void prim(graph &g,int w[6],int

r) g.adj[r].dist = 0

; priority_queue

,comp>q;

for(int i=0;i)

while(!q.empty())

p = p->next;

}priority_queue

,comp>q3;

while(!q.empty())

q=q3;

}}void addedge(graph &g,int i,int j,int weight,int w[6

])void print_path(graph &g,int w[6

]) }

}int

main();

for(int i=0;i)

int w[6][6

];

for (int i = 0; i < 6; ++i)

else}}

addedge(g,

0,1,6

,w);

addedge(g,

0,2,1

,w);

addedge(g,

0,3,5

,w);

addedge(g,

1,2,5

,w);

addedge(g,

1,4,3

,w);

addedge(g,

2,3,5

,w);

addedge(g,

2,4,6

,w);

addedge(g,

2,5,4

,w);

addedge(g,

3,5,2

,w);

addedge(g,

4,5,6

,w);

prim(g,w,0);

print_path(g,w);

cout

<

return0;

}

view code

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 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...