這裡主要講了兩個演算法。
首先說明下,本文講到的兩個演算法都是和連線矩陣和連線表沒有關係的,因為每個演算法開始的時候,都會有乙個初始化**,經過初始化後,最後都會變成統一的演算法語句。
我們這裡會介紹兩種演算法,第一種演算法,prim演算法。這個演算法,內容就是加點法,可以理解為在u集合周圍找到權值最小的邊的點,新增到u集合上,使得最後所有的點都在u集合上。
演算法思想:
假設n=(v, e)是連通網,te是n上最小生成樹中邊的集合。演算法如下: (1)初始時,u=,te=φ; (2)在所有∈e(u∈u,v∈v-u)的邊中選一條代價最小的邊(u, v)併入集合te,同時將v併入u; (3)重複(2),直到u=v為止。此時,te中必含有n-1條邊,則t=(v, te)為n的最小生成樹。 可以看出,普利姆演算法是逐步增加u中的頂點,稱為「加點法」。 但請注意:在選擇最小邊時,可能有多條權值相等的邊可選,此時任選其一。
**如何實現這個prime演算法,事實上也就是四個步驟.
初始化找到乙個最小的權值的點(在**找?在lowcost裡面找)
將其加入u集合中
修改lowcost和parent陣列
我們這裡分別來講:
初始化
int sum,k;
int lowcost[vertexnum],parent[vertexnum];
k=locate(g,u);
int n=g->vertexnum;
for(int i=0;iedge[k][i];
parent[i]=k;
} parent[k]=-1;
lowcost[k]=0;//也就是用連線矩陣,設定好lowcost陣列和parent陣列
找到乙個最小的權值的點k=findmin(lowcost,n);
修改lowcost和parent陣列for(int j=0;jedge[k][j]edge[k][j];
parent[j]=k;
}}
總的**:
void prim(graph g,int u)
parent[k]=-1;
lowcost[k]=0;
sum=0;
for(int i=1;iedge[k][j]edge[k][j];
parent[j]=k;
}} }
return sum;
}
krus演算法,其實這個也就是乙個並查集演算法,我這裡先把**放出來。void krus(graph g) }
}
其中的find函式在這裡
int find(int parent,int x)
return x;
}
先寫到這裡,以後來完善
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構(最小生成樹)
對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...
資料結構 最小生成樹
對於乙個圖連通圖g,n個點,e條邊,最小生成樹就是n 1條邊圖的生成子圖,且這n 1條邊的權值和最小。對於乙個圖的兩種演算法 prim演算法和kruskal演算法,這兩種演算法都是基於貪心思想的。偽 實現 輔助變數 lowcost陣列,儲存當前可連通的其他節點的最小權值。cnt 0表示當前樹連線節點...