最小生成樹

2021-07-14 15:47:48 字數 1841 閱讀 6415

概念:

乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。

簡單來說:最小生成樹就是在乙個連通圖(每個點都相連的無向圖)中使得權值和最小的樹,保證每個點都在裡面。

最小生成樹其實是最小權重生成樹的簡稱。

最小生成樹又叫「mst」。

應用:

例如:要在n個城市之間鋪設光纜,主要目標是要使這 n 個城市的任意兩個之間都可以通訊,但鋪設光纜的費用很高,且各個城市之間鋪設光纜的費用不同,因此另乙個目標是要使鋪設光纜的總費用最低。這就需要找到帶權的最小生成樹。

求最小生成樹的方法:

最小生成樹可以用kruskal(克魯斯卡爾)演算法或prim(普里姆)演算法求出。

prim演算法的時間複雜度不依賴於排序演算法,並且主要與點的個數有關,適用於密集圖。

kruskal演算法需要排序,但使用幷查集可節省判斷時間,主要與邊的條數有關,適用於稀疏圖。

簡單來說:prim演算法,適用於點少的圖。kruskal演算法,適用於邊少的圖。

思想:

貪心思想:每次選取最小邊。

演算法描述:

(1)輸入:乙個加權連通圖,其中頂點集合為v,邊集合為e;

(2)初始化:vnew = ,其中x為集合v中的任一節點(起始點),enew = {},為空;

(3)重複下列操作,直到vnew = v:

a.在集合e中選取權值最小的邊< u, v >,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v∈v(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);

b.將v加入集合vnew中,將< u, v >邊加入集合enew中;

(4)輸出:使用集合vnew和enew來描述所得到的最小生成樹。

圖例描述:

時間複雜度:

頂點數v,邊數e

鄰接矩陣:o(v)

鄰接表:o(elog2v)

**:

#includeusing namespace std;

const int maxn=1000000;

int n,k,tmp,ans,map[1001][1001],dis[maxn];

bool flag[maxn];

void prim()

//找出最小距離的節點

flag[k]=1;//把訪問的節點做標記

for(int j=1;j<=n;j++)

if(!flag[j]&&dis[j]>map[k][j])

dis[j]=map[k][j];//更新最短距離

}}int main()

a[101];

int find(int x)

int cmp(node a,node b)

void unionn(int x,int y)

int main()

if(k==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...