資料結構 最小生成樹問題

2021-09-25 07:49:48 字數 1577 閱讀 3078

假設n=}是乙個連通網,u是頂點集v的乙個非空子集,若(u, v)是一條具有最小權值的邊,其中u∈u, v∈v-u,則比存在一棵包含邊(u, v)的最小生成樹

假設集合u裡面存放的是已經在最小生成樹中的頂點,集合te存放的是最小生成樹的邊,演算法從u=開始,在所有u∈u,v∈v-u的所有邊(u, v)中選一條權值最小的邊加入生成樹,同時v0加入頂點集合u中,重複上述操作,直至所有頂點都已經加入頂點集合為止

//prim演算法的最小生成樹//

void minispantree_prim(mgraph *g)

//初始化完成,接下來開始生成最小生成樹

for (i = 1; i < g->vertex_num; i++)

j++;

} //此時,k存放的就是當前可以接觸到的最小權值邊的乙個頂點

//adjvex[k]記錄的是當前所能接觸到的最小權值邊的另乙個頂點

printf("(%d,%d)\n", adjvex[k], k);

lowcost[k] = 0;//表示這個頂點已經加入到最小生成樹中

//接下來要尋找新的可以接觸到的最小權值邊

for (j = 1; j < g->vertex_num; j++)

} }}

首先將所有頂點都加入最小生成樹的頂點集s中,然後每次選擇權值最小的邊,選擇完之後要判斷是否形成迴路,如果形成迴路的話就要重新選一條權值次之的邊,如此迴圈,知道選擇完n-1條邊就構成了一棵最小生成樹

//kruskal演算法的最小生成樹//

//定義邊集陣列

typedef struct edge;

//生成邊集陣列

void create_array(mgraph *g,edge edges)

} }//接下來給邊集陣列排序(只會冒泡法了)

//出迴圈時邊集陣列的數量是count-1

//排序要求從小到大

for (i = 0; i < count; i++)

} }//列印邊集陣列

printf("邊集陣列為:\n");

printf("\tbegin\tend\tweight\n");

for (i = 0; i < count; i++)

}//查詢函式,用於查詢如果加入這條邊的話是否存在存在迴路

int find(int *parent, int f)

return f;

}//演算法主體

void minispantree_kruskal(mgraph *g)

//接著迴圈遍歷每一條邊

printf("生成最小生成樹(kruskal演算法):\n");

for (i = 0; i < g->edge_num; i++)

}}

資料結構 最小生成樹

生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有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表示當前樹連線節點...