最小生成樹

2021-06-03 22:39:12 字數 2258 閱讀 5986

在乙個具有幾個頂點的連通圖g中,如果存在子圖g'包含g中所有頂點和一部分邊,且不形成迴路,則稱g'為圖g的生成樹,代價最小生成樹則稱為最小生成樹。

最小生成樹的特點:

(1)mst性質  最小生成樹性質:設g=(v,e)是乙個連通網路,u是頂點集v的乙個真子集。若(u,v)是g中一條「乙個端點在u中(例如:u∈u),另乙個端點不在u中的邊(例如:v∈v-u),且(u,v)具有最小權值,則一定存在g的一棵最小生成樹包括此邊(u,v)。

演算法1:prime演算法,複雜度為o(n^2),與網中的邊數無關,所以適合於求邊稠密的網的最小生成樹。它的演算法思想相當於貪心演算法,首先從任意頂點vi開始構造生成樹,並將vi加入到生成樹t中,用乙個一維陣列dist[j]記錄其他頂點到vi的距離,掃瞄一維陣列dist[j],選取值最小的頂點j和相應的邊加入t中,再以j為中間點更新vj頂點到其它的頂點k的距離值,如果dist[k]>map[j][k](map[j][k]為頂點j到k的權值),則更新dist[k]為map[j][k],重複這個操作直到t中有n個頂點。

在構造鄰接矩陣的時候如果兩個邊沒有相連的話,直接設這個值為無窮大~~

例題1:nyoj 38(佈線問題),分析:prime演算法,最小與外界相連的費用的樓作為起始點求最小生成樹。以這題來具體分析prime演算法的步驟。

#include#include#include#includeusing namespace std;

const int max=505;

#define inf 10000000

#define clr(arr,val) memset(arr,val,sizeof(arr))

int num,n,m,cost[max],dist[max],visit[max],map[max][max];

int prime(int pos)

return sum;

}int main()

return 0;

}

演算法2:kruskal演算法,過程為:先將圖中的各邊按照從小到大的順序排列,然後遍歷該圖,找到權值最小的邊的頂點,該頂點不能訪問過,且不能和以前的邊組成迴路,這個時候可以用並查集(並查集的知識可以點這裡)來判連通,如果滿足這兩個條件則將該條邊加入到最小生成樹t中,迴圈,直到找到n-1條邊為止。由於這個演算法只與邊有關,所以適合於稀疏圖。開始看錯了,這個行數e要求的是n*(n-1)/2,我一直定義的是505,re了n次,還是得看清楚題目,**:

#include#include#include#includeusing namespace std;

const int max=125000;

#define clr(arr,val) memset(arr,val,sizeof(arr))

int num,n,m,cost[max];

struct graph

else

return true;

}private:

int father[max],rank[max];

}ufs;

int main()

node(int num,int len):len(len),num(num){}

int len,num;

}; bool operator<(const node& n1,const node& n2)

const int max=510;

const int maxe=250000;

int head[max],next[maxe],num[maxe],len[maxe];

int dis[max],top;

void add(int u,int v,int len)

bool inq[max];

int main()

dis[0]=0;

q.push(node(0,0));

while(!q.empty())

} }

int minl=0x3f3f3f3f;

for(int i=0;i!=m;i++)

printf("%d\n",accumulate(dis,dis+m,0)+minl);

} return 0;

}

prime演算法題目總結:(有待更新)

nyist 38,434;

hdu 1102,1162,1233,1863,1301,1875

poj 1789,2253,2349,1251,1861,2421,2728,2485,1287。。。。

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...