最小生成樹

2021-10-07 16:17:44 字數 2648 閱讀 2454

最小生成樹 常見演算法為:prim和kruskal

prim:對節點進行處理,節點少邊多的稠密圖更優。

kruskal:對邊進行處理,邊少的圖更優。

luogu,p3366 【模板】最小生成樹

prim做法:

以某一結點為根,更新子節點,若更新成功,尋找其中長度最小的作為新節點.

樸素做法複雜度:o(n2)

尋找其中長度最小的可用堆優化.

#

include

#define

inf1e9

#define

maxn

5005

using

namespace std;

struct

prim

;struct

node

; node node[maxn]

; queue<

int>q;

int mindis[maxn]

;//點i到生成樹的最小邊權值

int n;

void

init

(int n)

this

->n=n;

}void

add(

int u,

int v,

int w));

}void

prim

(int root)

}for

(int i=

1;i<=n;i++)}

}if(minid!=-1

)q.push

(minid);}

}};int n,m,x,y,z,ans=0;

prim a;

intmain()

a.prim(1

);for(

int i=

1;i<=n;i++

) cout

}

堆優化:

#

include

#define

maxn

5005

#define

inf1e9

using

namespace std;

struct

prim};

struct

node

; node node[maxn]

;int mindis[maxn]

;int vis[maxn]

; priority_queueq;

void

init

(int n)

}void

add(

int x,

int y,

int v));

}int

prim

(int n));

//root = 1;

mindis[1]

=0;int ret=0;

while

(!q.

empty()

));}

}}return ret;}}

;int n,m,x,y,z,ans=0;

prim prim;

intmain()

ans=prim.

prim

(n);

cout<"\n"

;return0;

}

kruskal做法:(update 2.9)

將所有邊入隊,尋找最短邊,連線其兩邊的節點為一棵樹,若兩節點已在同一棵樹上,則跳過(判斷是否在同一棵樹可用並查集).

該方法比prim更易理解和編寫.

複雜度大概: o(mlogm)

#

include

#define

maxn

200005

using

namespace std;

struct

kruskal};

static

const

int maxn=maxn;

int f[maxn]

;//edge edge[maxn];

priority_queueq;

void

init

(int n)

while

(!q.

empty()

)q.pop()

;}void

addedge

(int x,

int y,

int v));

}int

find

(int x)

intkruskal

(int n)

if(totedge>=n-1)

break;}

return ret;}}

;int n,m,x,y,z,ans=0;

kruskal kru;

intmain()

cout

(n);

return0;

}

最小生成樹 次小生成樹

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