最小生成樹

2021-08-20 01:55:36 字數 1293 閱讀 9506

時間限制: 1 sec  記憶體限制: 32 mb

最小生成樹問題是實際生產生活中十分重要的一類問題。假設需要在n個城市之間建立通訊聯絡網,則連通n個城市只需要n-1條線路。這時,自然需要考慮這樣乙個問題,即如何在最節省經費的前提下建立這個通訊網。

可以用連通網來表示n個城市以及n個城市之間可能設定的通訊線路,其中網的頂點表示城市,邊表示兩個城市之間的線路,賦於邊的權值表示相應的代價。對於n個頂點的連通網可以建立許多不同的生成樹,每一棵生成樹都可以是乙個通訊網。現在,需要選擇一棵生成樹,使總的耗費最小。這個問題就是構造連通網的最小代價生成樹,簡稱最小生成樹。一棵生成樹的代價就是樹上各邊的代價之和。

而在常用的最小生成樹構造演算法中,普里姆(prim)演算法是一種非常常用的演算法。以下是其演算法的大致結構:

在本題中,讀入乙個無向圖的鄰接矩陣(即陣列表示),建立無向圖並按照以上描述中的演算法建立最小生成樹,並輸出最小生成樹的代價。

輸入的第一行包含乙個正整數n,表示圖中共有n個頂點。其中n不超過50。

以後的n行中每行有n個用空格隔開的整數,對於第i行的第j個整數,如果不為0,則表示第i個頂點和第j個頂點有直接連線且代價為相應的值,0表示沒有直接連線。當i和j相等的時候,保證對應的整數為0。

輸入保證鄰接矩陣為對稱矩陣,即輸入的圖一定是無向圖,且保證圖中只有乙個連通分量。

只有乙個整數,即最小生成樹的總代價。請注意行尾輸出換行。

4

0 2 4 0

2 0 3 5

4 3 0 1

0 5 1 0

6
在本題中,需要掌握圖的深度優先遍歷的方法,並需要掌握無向圖的連通性問題的本質。通過求出無向圖的連通分量和對應的生成樹,應該能夠對圖的連通性建立更加直觀和清晰的概念。

這道題就是一道最小生成樹的純模板題。具體見**:

#include const int inf = 99999999;

int main()

}for (int i = 0; i < n; i++)

vis[0] = count = 1;

while (count < n)

}vis[data] = 1;

count++;

sum += dis[data];

for (int k = 0; k < n; k++)

}printf("%d\n", sum);

}return 0;

}

最小生成樹 次小生成樹

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