C語言鄰接表結構實現克魯斯卡爾演算法

2021-09-05 11:35:35 字數 2113 閱讀 5615

c語言 資料結構

克魯斯卡爾演算法是一種用來查詢最小生成樹的一種演算法,由joseph kruskal在2023年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪心演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。

克魯斯卡爾演算法適合頂點較多而邊較少的情況,因為克魯斯卡爾演算法需要對圖中的邊的權值進行排序。

基本思想

在乙個包含n個頂點而邊集為空的子圖中,把子圖中各個頂點看成各棵樹上的根結點,之後,從網的邊集 e 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,即把兩棵樹合成一棵樹,反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直到森林中只有一棵樹,也即子圖中含有 n-1 條邊為止。

步驟將圖g中的頂點及邊的資訊中讀取儲存

將圖中的邊按權值進行排序

從權值最小的邊開始,如果這條邊連線的兩個結點不在同乙個聯通分量裡面,就將其加入最小生成樹

重複3直至圖g中所有的頂點都在同乙個聯通分量裡面

克魯斯卡爾演算法的平均時間複雜度為o(|e|log|e|),其中e和v分別是圖的邊集和點集,可見克魯斯卡爾演算法的時間複雜度主要取決於邊數。

一、圖的資料結構

typedef struct node edge;

typedef struct adjheight; //陣列的資料元素型別結構體

typedef struct adjlgraph; //鄰接表結構體

二、克魯斯卡爾的資料結構

typedef struct edges edge;

struct edges ;

該資料結構主要用來儲存從鄰接表中得到的所有邊及其權值。

初始化乙個圖

void creategraph(adjlgraph *g, datatype v, int n, rowcol d, int e) 

for (k = 0; k < e; k++)

insertedge(g,d[k].row,d[k].col,d[k].cost);

}

從鄰接表中取出所有邊並去掉重複
/*

遍歷圖,將邊加入edge,並去掉重複的邊

*/edge *visitgraph(adjlgraph *g)

else

liveflag = 1;

}if (g->a[i].source > operatorelem->dest && liveflag)

else if (liveflag)

else

;operatorelem = operatorelem->next;

} } return e;

}

排序所有邊
/*

對edges排序,採用氣泡排序法

*/void graphbubblesort(edge *e,int num)

}}

克魯斯卡爾演算法
edge *kruskal(adjlgraph *g,edge *e) 

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

i = 0;

while (flag)

else

else

if (tlinkerflag[tempmin] != 0) }}

else

} else

else

} }tempflag = tlinkerflag[0];

for (m = 0 , countflag = 0; m < num; m++)

if (countflag == num)

flag = 0;

i++;

}return result;

}

在克魯斯卡爾演算法中,用陣列標記聯通分量,如果兩個頂點所對應的陣列相應位置數值相同表示在同乙個聯通分量中,如果不在同乙個聯通分量,則保留該邊,否則刪除這條最終所有的頂點所對應的標記dou』xian都相同時認為最小生成樹完成。

c語言克魯斯卡爾演算法

我們用鄰接矩陣來表示該圖,克魯斯卡爾演算法思想及找到最小邊,檢視是否形成迴路,若形成迴路則這條邊不形成,若不形成迴路則構成最小路徑,以此類推。思路和 都在下方 建立乙個edge陣列,存放鄰接矩陣的有用資料 typedef struct edge int n g numvertices edge ed...

C語言 資料結構 克魯斯卡爾kruskal

include include include ljjz.h 求解最小生成樹演算法 typedef struct edgedata edge 對邊向量快速排序 邊向量edges邊向量左右下標left right void quicksort edge edges,int left,int right...

資料結構與演算法 克魯斯卡爾演算法 Kruskal

克魯斯卡爾演算法,是用來求加權連通圖的最小生成樹的演算法 基本思想 按照權值從小到大的順序選擇n 1條邊,並保證這n 1條邊不構成迴路 具體做法 首先構造乙隻含有n個頂點的森林,然後依權值從小到大從連通網中選擇邊加入到森林中,並使森林不構成迴路,直到森林變成一棵樹為止 應用場景 實現 public ...