最小生成樹

2021-10-19 21:41:38 字數 2031 閱讀 3382

學完最小生成樹又馬上開始學最短路徑,兩者關係開始混淆

此篇是幫助我本人對這兩個演算法有所了解與辨別

最短路徑是對於乙個圖的兩個結點而言最短的。在乙個圖中,結點a通過某些結點和邊可以走到結點b,那這些結點和邊就組成一條a到b的路徑,a到b的最短路徑就是a到b的所有路徑中邊zhuan值總和最小的那一條(或多條)。

最小生成樹是對於乙個圖本身而言的。對於乙個有n個結點的無向連通圖(邊沒有方向,任意兩點之間都存在路徑可以到達),必然可以去掉某些邊,使得最終剩下n-1條邊,並且n個結點仍然是連通的,這n個結點和n-1條邊組成了原圖的乙個生成樹,而最小生成樹就是所有可能的生成樹中n-1條邊的shu值總和最小的那乙個(或多個)。

總結一句話,最短路徑是到其他點最短,而最小生成樹是將多餘的邊不要使得總的權值最小

最小生成樹常用演算法有:prim,kruskal

初始化:u= ,tree = {};

如u合集輸出最小生成樹並結束

在所有的兩棲邊中找一條權最小的邊將邊(u,v)加入邊集tree並將頂點加入集合u中

由於新點加入狀態變化對u與v-u兩棲邊調整

轉2

#include

#include

#include

using

namespace std;

#define maxn 30

#define inf 100000

int road[maxn]

[maxn]

;//鄰接矩陣

int dis[maxn]

;//判斷行,從中取出最小點加入vis

bool vis[maxn]

;//true代表已經納入,false代表是為納入

int n;

void

prim()

for(

int i =

1; i <= n; i++

)//包括第乙個點在內,一共要納入n個點

} vis[v]

=true

;//把該頂點納入已知集合 ,v就是未納入頂點最短距離的點

for(

int j =

0; j < n; j++

)//更新與未納入集合中的頂點的邊的最小權值

}int ans;

for(

int i =

1; i < n; i++

) ans +

= dis[i]

;//將每個點(除起點)的距離累加

printf

("%d\n"

,ans);}

intmain()

/*for(int i=0;iprim()

;}return0;

}

kruskal演算法

貪心法使每條邊權值盡可能少, 適用稀疏圖

#include

#include

#include

#include

using

namespace std;

int n,m,i,j,sum,cnt;

int parent[

10000];

void

init()

intfind

(int n)

return n;

}int

join

(int a,

int b)

return0;

}struct purchasep[

40000];

inline

bool

cmp(purchase a,purchase b)

intmain()

sort

(p+1

,p+m,cmp)

;init()

;for

(i=1

;i<=m;i++)if

(cnt==n-1)

break;}

cout

}

最小生成樹 次小生成樹

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