最小生成樹:
乙個有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]
2.kruskal演算法#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()
演算法描述:
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為邊數。
例題**:
例題2:#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()
洛谷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 更...