1765 演算法7 9 最小生成樹

2021-07-03 17:36:43 字數 1710 閱讀 7476

最小生成樹問題是實際生產生活中十分重要的一類問題。假設需要在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
在本題中,需要掌握圖的深度優先遍歷的方法,並需要掌握無向圖的連通性問題的本質。通過求出無向圖的連通分量和對應的生成樹,應該能夠對圖的連通性建立更加直觀和清晰的概念。

program p1765;

var cost:array[1..50,1..50]of longint;

mincost,closed:array[1..50]of longint;

min,k,i,j,n,x,y,sum:longint;

begin

readln(n);

for i:=1 to n do

for j:=1 to n do

begin

read(cost[i,j]);

if(i<>j) and(cost[i,j]=0)then cost[i,j]:=maxint;

end;

sum:=0;

for i:=1 to n do

begin

mincost[i]:=cost[1,i];

closed[i]:=1;

end;

for i:=2 to n do

begin

min:=maxint;

for j:=1 to n do

if(mincost[j]0)then

begin

min:=mincost[j];

k:=j;

end;

sum:=sum+min;

mincost[k]:=0;

for j:=1 to n do

if(mincost[j]>cost[k,j])and(mincost[j]<>0) then

begin

mincost[j]:=cost[k,j];

closed[j]:=k;

end;

end;

writeln(sum);

end.

HHUOJ 1648 演算法7 9 最小生成樹

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

最小生成樹演算法

由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...

最小生成樹演算法

乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...