最小生成樹問題

2021-08-28 02:44:57 字數 2419 閱讀 6912

最小生成樹:

乙個有n個點的圖,邊一定是大於等於n-1條的。圖的最小生成樹,就是在這些邊中選擇n-1條出來,連線所有的n個點。這n-1條邊的邊權之和是所有方案中最小的。

最小生成樹用來解決什麼問題?   

就是用來解決如何用最小的「代價」用n-1條邊連線n個點的問題。

例題:洛谷p3366

乾坤大挪移

最小生成樹共有兩種演算法:

prim演算法與kruskal演算法

1.prim演算法

prim演算法採用與dijkstra、bellman-ford演算法一樣的「藍白點」思想:

白點代表已經進入最小生成樹的點,藍點代表未進入最小生成樹的點。

演算法思想:

以1為起點生成最小生成樹,min[v]表示藍點v與白點相連的最小邊權。

mst表示最小生成樹的權值之和。

1)初始化:min[v]= ∞(v≠1); min[1]=0;mst=0; b)for (i = 1; i<= n; i++) 1.尋找min[u]最小的藍點u。

2.將u標記為白點

3.mst+=min[u]

4.for 與白點u相連的所有藍點v if (w[u][v]

#include

#include

#include

using

namespace

std;

#define inf 0x7fffffff

#define maxn 5005

int cost[maxn][maxn],minn,n,m,v2[maxn],tot=1,now,ans;

bool v1[maxn];

inline

void getcost()

}//先將陣列賦為極大值

for(int i=1,u,v,w;i<=m;i++)

}//初始化cost陣列

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

v1[1]=1;

//找出與1節點相連的邊並進行標記

}inline

int prim()

}v1[now]=1;

//在找出與now節點相連的邊並進行標記

}return ans;

}int main()

2.kruskal演算法

演算法描述:

1.初始化並查集。father[x]=x。

2.tot=0

3.將所有邊用快排從小到大排序。

4.計數器 k=0;

5.for (i=1; i<=m; i++) //迴圈所有已從小到大排序的邊

if 這是一條u,v不屬於同一集合的邊(u,v)(因為已經排序,所以必為最小)

begin  

①合併u,v所在的集合,相當於把邊(u,v)加入最小生成樹。  

②tot=tot+w(u,v)

③k++

④如果k=n-1,說明最小生成樹已經生成,則break; end;

結束,tot即為最小生成樹的總權值之和。

kruskal演算法的時間複雜度為o(e*loge),e為邊數。

例題**:

#include

#include

#include

#include

using

namespace

std;

int r[5005],n,m,ans,w,e,cnt;

struct edge

edge[222222];

bool cmp(edge a,edge b)//交換函式

void kruskal()//演算法精華

}int main()

例題2:

洛谷p1546

傳送門

運用kruskal演算法解決

#include

#include

#include

using

namespace

std;

struct point

;point a[9901];

int fat[101];

int n,i,j,x,m,tot,k;

int father(int x)

void unionn(int x,int y)

int cmp(const point&a,const point&b)

int main()

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

fat[i]=i;

sort(a+1,a+m+1,cmp);

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

if (k == n-1) break;

}cout

<< tot;

return

0;}

最小生成樹問題

1.構造可以使n個城市連線的最小生成樹。問題描述 給定乙個地區的n個城市間的距離網,用prim演算法或kruskal演算法建立最小生成樹,並計算得到的最小生成樹的代價。4 要求 1 城市間的距離網採用鄰接矩陣表示,鄰接矩陣的儲存結構定義採用課本中給出的定義,若兩個城市之間不存在道路,則將相應邊的權值...

最小生成樹問題

最小生成樹 是一棵樹 無迴路 個頂點一定有 條邊 包含全部頂點 條邊都在圖里 邊的權重和最小 生成約束 只能用圖里有的邊 只能正好用掉 條邊 不能有迴路 主要演算法 prim演算法 讓樹長大 int prim int n int ans 0 距離權值總和 vis 1 true 生成樹的根 起點 標記...

最小生成樹問題

最小生成樹問題一般對應無向圖,一般都有m n n,所以mlogm和mlogn差不多,所以我們一般用kruskal而不常用堆優化的prim 1.樸素版primo n2 基本思路 初始化 dis i 正無窮大 for i 0 i n次迭代,因為要加入n個點到集合中 t 找到集合外距離最近的點 用 t 更...