C語言解決最小生成樹(Prim & Kruskal算法)

????????最小生成樹是一個無向連通圖的最小權(quán)重生成樹。在C語言中,可以使用Prim算法或Kruskal算法來實現(xiàn)最小生成樹。
Prim算法實現(xiàn)最小生成樹的思路如下:
創(chuàng)建一個數(shù)組key[],用于存儲頂點到最小生成樹的最小權(quán)重。
創(chuàng)建一個數(shù)組parent[],用于存儲最小生成樹中每個頂點的父節(jié)點。
創(chuàng)建一個數(shù)組visited[],用于標(biāo)記頂點是否已經(jīng)加入最小生成樹。
將key[]數(shù)組初始化為無窮大(INF),parent[]數(shù)組初始化為空(-1),visited[]數(shù)組初始化為false。
將第一個頂點作為起始頂點,將key[0]設(shè)置為0。
循環(huán)進行以下步驟,直到所有頂點都被加入最小生成樹:
找到未加入最小生成樹的頂點中key值最小的頂點。
將該頂點標(biāo)記為visited[]數(shù)組中的true。
遍歷該頂點的所有鄰接頂點,如果鄰接頂點未被訪問且邊的權(quán)重小于key值,則更新key值和parent值。
輸出最小生成樹的邊和權(quán)重。
Kruskal算法實現(xiàn)最小生成樹的思路如下:
創(chuàng)建一個數(shù)組parent[],用于存儲每個頂點的父節(jié)點。
創(chuàng)建一個數(shù)組rank[],用于存儲每個頂點的秩。
創(chuàng)建一個輔助數(shù)組edges[],用于存儲圖中的所有邊。
將圖中的所有邊按照權(quán)重從小到大排序。
初始化parent[]數(shù)組和rank[]數(shù)組,將所有頂點的父節(jié)點設(shè)置為自身,秩設(shè)置為0。
循環(huán)遍歷排序后的邊,如果兩個頂點不在同一個連通分量中(通過判斷它們的最終父節(jié)點是否相同):
將邊加入最小生成樹中。
合并兩個頂點所在的連通分量,即將其中一個頂點的父節(jié)點設(shè)置為另一個頂點。
輸出最小生成樹的邊和權(quán)重。

