最小生成樹之prime演算法

2021-07-04 17:30:24 字數 1150 閱讀 2053

在這裡我就不擺最小生成樹的定義了,對於最小生成樹,我們必須注意一下兩點:

1》盡可能選取權值小的邊,但不能構成迴路。

2》選取合適的n-1條邊將聯通圖的n個頂點連線起來。

演算法簡單描述

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

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

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

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

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

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

下面給出**實現:

#include #include #define maxint 0x3f3f3f3f

#define n 110

//建立map二維陣列儲存圖表,low陣列記錄每2個點間最小權值,visited陣列標記某點是否已訪問

int map[n][n],low[n],visited[n];

int n;//圖節點的個數

/*prime演算法*/

int prim()

//最小權值累加

result+=min;

//標記該點

visited[pos]=1;

//更新權值,即加入乙個新節點,就要根新該節點鄰接邊的真實權值

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

if(visited[j]==0&&low[j]>map[pos][j])

low[j]=map[pos][j];

}return result;

}int main()

{ int i,ans;

int p=-1,q=-1,k=-1,m=-1;

printf("請輸入節點的個數:");

while(scanf("%d",&n)!=eof)

{//所有權值初始化為最大

memset(map,maxint,sizeof(map));

printf("請輸入邊的個數:");

scanf("%d",&m);

for(i=0;i

最小生成樹 Prime演算法

對於乙個圖,它的所有生成樹中必有乙個 邊的權值最小 的生成樹,我們把它稱為最小生成樹。概念很抽象,換做實際問題 有十個城市,各個城市之間距離或遠或近。需要建設乙個道路網,把十個城市連線在一起,要求道路網的道路長度最小。各個城市的連線可以抽象為乙個圖,本質上即是求該圖的乙個最小生成樹。每乙個圖可能有多...

最小生成樹 prime演算法

問題 c 建立通訊 時間限制 1 sec 記憶體限制 128 mb 提交 7 解決 4 提交 狀態 討論版 題目描述 據不完全統計,受 影響,四川大部分災區通訊陷入癱瘓,數千個基站因斷電 傳輸中斷等原因退出服務,目前總公司已緊急部署對受災地區進行通訊搶修。按照應急通訊保障預案,必須盡快 付出代價最小...

最小生成樹 prime演算法

生成樹頂點集合,初始只含起點 v0。visit i 1 i點已在生成樹中 lowcost i 生成樹中的點 到頂點 i 的最短距離。演算法過程 1.初始化生成樹,一開始只將起點 v0 加入到 樹中。2.初始化 lowcost 陣列,初值為 v0 到各頂點的距離,無邊則為 inf。重複以下步驟,直到所...