資料結構之生成最小樹

2021-08-20 10:00:35 字數 1436 閱讀 7237

這裡主要講了兩個演算法。

首先說明下,本文講到的兩個演算法都是和連線矩陣和連線表沒有關係的,因為每個演算法開始的時候,都會有乙個初始化**,經過初始化後,最後都會變成統一的演算法語句。

我們這裡會介紹兩種演算法,第一種演算法,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表示當前樹連線節點...