假設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條邊就構成了一棵最小生成樹![](https://pic.w3help.cc/03b/87278a270fb56070c892bc7eefdaf.jpeg)
//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表示當前樹連線節點...