最小生成樹和最大生成樹

2022-07-08 23:12:19 字數 2131 閱讀 6365

生成樹(spanning tree):乙個連通無向圖的生成子圖,同時要求是樹。也即在圖的邊集中選擇n-1條,將所有頂點連通。

最小生成樹為乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。最小生成樹可以用kruskal(克魯斯卡爾)演算法或prim(普里姆)演算法求出。

我們定義無向連通圖的最小生成樹(minimum spanning tree,mst)為邊權和最小的生成樹。

例題(洛谷):【模板】最小生成樹

kruskal 演算法是一種常見並且好寫的最小生成樹演算法,由 kruskal 發明。該演算法的基本思想是從小到大加入邊,是個貪心演算法。

其運用到了:並查集 、 貪心 、 圖的儲存 。

#include#define inf 0x7f7f7f7f

using namespace std;

typedef long long ll;

const int n=2e5+5;

int n,m;

ll ans;

struct edgee[n];

int f[5005],add=1;

bool cmp(edge a,edge b);

} sort(e,e+m,cmp);

for(int i=0;iprim 演算法是另一種常見並且好寫的最小生成樹演算法。該演算法的基本思想是從乙個結點開始,不斷加點(而不是 kruskal 演算法的加邊)。

實現:

具體來說,每次要選擇距離最小的乙個結點,以及用新的邊更新其他結點的距離。

其實跟 dijkstra 演算法一樣,每次找到距離最小的乙個點,可以暴力找也可以用堆維護。

堆優化的方式類似 dijkstra 的堆優化,但如果使用二叉堆等不支援 decrease-key 的堆,複雜度就不優於 kruskal,常數也比 kruskal 大。所以,一般情況下都使用 kruskal 演算法,在稠密圖尤其是完全圖上,暴力 prim 的複雜度比 kruskal 優,但不一定實際跑得更快。

還未進行**實現,之後補上。

和最小生成樹類似,只不過在乙個圖的所有生成樹中邊權值和最大的生成樹即為最大生成樹。

例題為學校ds**上的題目,和最小生成樹的題目差不多。

1、將圖中所有邊的邊權變為相反數,再跑一遍最小生成樹演算法。相反數最小,原數就最大。

2、修改一下最小生成樹演算法:對於kruskal,將「從小到大排序」改為「從大到小排序」;

對於prim,將「每次選到所有藍點代價最小的白點」改為「每次選到所有藍點代價最大的點」

kruskal實現**

/*用kruskal實現最大生成樹*/

/*將邊權從大到小排序的kruskal*/

#include#define inf 0x7f7f7f7f

using namespace std;

typedef long long ll;

const int n=1e5+5;

int n,m;

ll ans;

struct edgee[n];

int f[1005],add=1;

bool cmp(edge a,edge b)

inline int find(int k)

inline void link(int a,int b)

int main(); }

sort(e,e+m,cmp);

for(int i=0;i#define inf 0x7f7f7f7f

using namespace std;

typedef long long ll;

const int n=1e5+5;

int n,m;

ll ans;

struct edgee[n];

int f[1005],add=1;

bool cmp(edge a,edge b);

} sort(e,e+m,cmp);

for(int i=0;i} if(add!=n)cout<<-1;

else cout<<-1*ans;

return 0;

}

最小生成樹之最大生成樹

題目 poj 3723 conscription 題意 要徵兵n個男兵和m個女兵,每個花費10000元,但是如果已經徵募的男士兵中有和將要徵募的女士兵關係好的,那麼可以減少花費,給出關係,求最小花費。分析 這個題目初始乙個是個二分圖,以為可以從這裡入手,但是這個題目這個性質沒用。初始花費沒人1000...

最小生成樹 次小生成樹

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

最小生成樹

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