演算法設計和分析(Prim演算法構建最小生成樹)

2022-05-30 05:21:09 字數 2215 閱讀 7021

問題:

給定無向圖g(n,m)表明圖g有n個頂點,m條邊,通過prim演算法構造乙個最小生成樹

分析:

演算法流程:

構造好的最小生成樹就是step6

執行**:

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

#define mem(a,x) memset(a,x,sizeof(a))

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid + 1,r

#define p pair#define ull unsigned long long

using

namespace

std;

typedef

long

long

ll;const

int maxn = 100

;const ll mod = 998244353

;const

int inf = 0x3f3f3f3f

;const

long

long inf = 0x3f3f3f3f3f3f3f3f

;const

double eps = 1e-7

;int n, m; //

假設有n個點,m條邊

int edge[maxn][maxn]; //

用鄰接矩陣來存圖

int vis[maxn]; //

記錄某點是否加入最小生成樹中

int dist[maxn]; //

記錄最小生成樹中每乙個點鄰接的最短邊

int father[maxn]; //

記錄某點的父親節點,記錄構成最小生成樹的邊

intmain()

for (int i = 1; i <= m; ++i)

vis[

1] = true; //

將1號點新增進最小生成樹中,作為樹根

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

father[

1] = -1; //

將樹根的父親節點設為-1

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

}vis[v] = true; //

將尋找到的最短路徑的終點加入最小生成樹中

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

int sum = 0

;

for (int i = 1; i <= n; ++i) sum += dist[i]; //

輸出最小生成樹的權值和,以及構成最小生成樹的邊

printf("

最小生成樹的權值是:%d\n

", sum);

printf(

"構成最小生成樹的邊為:\n");

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

}return0;

}/*6 91 5 1

1 6 2

1 2 3

2 6 4

2 3 5

3 6 6

3 4 7

4 6 8

4 5 9

樣例*/

prim

Prim演算法和Kruskal演算法

一 prim演算法 prim演算法實現的是找出乙個有權重連通圖中的最小生成樹,即 具有最小權重且連線到所有結點的樹。強調的是樹,樹是沒有迴路的 prim演算法是這樣來做的 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產...

Prim演算法和Kruskal演算法

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見...

Prim演算法的簡單分析

prim演算法主要的思路 將點集一分為二,通過找到兩個點集之間的最短距離,來確定最小生成樹,每次確定最短距離後,對兩個點集進行更新。具體的實現過程 難點就是如何找到兩個點集之間的最短距離,這裡設定兩個陣列,lowcost i mst i 分別表示以i為終點的邊和對應的起點,有了這兩個陣列就能夠順利的...