最小生成樹之Kruskal演算法C語言

2021-09-02 05:22:24 字數 1205 閱讀 6307

如下圖:

找到最小邊1,把v1,v4收錄

找到最小邊1,把v6,v7收錄

找到最小邊2,把v2收錄

找到最小邊2,把v3收錄

找到最小邊4,

找到最小邊6,把v5收錄

//儲存各個結點的根結點,用來判斷是否有迴路

int check

(int i,int j)

//檢查是否有迴路

else

}while(1

)else}if

(root1==root2)

//說明有迴路

else

else

//集合2比集合1大,集合1併入集合2

return1;

}}void

kruskal

(int edge[

size

],int n)

;while

(count

if(v1==-1

|| v2==-1

)printf

("\n");

}break;}

edge[v1]

[v2]

=edge[v2]

[v1]

=max;if

(check

(v1,v2))}

}int main

(int argc, char** argv)

root[i]=-

1;}for

(int i=

0;i)kruskal

(edge,n)

;return0;

}/*7 12

0 1 2

0 2 4

2 5 5

5 6 1

6 4 6

4 1 10

3 0 1

3 1 3

3 4 7

3 6 4

3 5 8

3 2 2

*/

最小生成樹之Kruskal演算法

最小生成樹 kruskal演算法描述 該演算法是基於貪心的思想得到的。首先我們把所有的邊按照權值先從小到大排列,接著按照順序選取每條邊,如果這條邊的兩個端點不屬於同一集合,那麼就將它們合併,直到所有的點都屬於同乙個集合為止。合併頂點可以利用並查集,換而言之,kruskal演算法就是基於並查集的貪心演...

最小生成樹之kruskal演算法

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

最小生成樹之kruskal演算法

克魯斯卡爾 kruskal 演算法過程 構造最小生成樹 u,te 1.置u的初值等於v 即包含有g中的全部頂點 te的初值為空集 即圖t中每乙個頂點都構成乙個連通分量 2.將圖g中的邊按權值從小到大的順序依次選取 若選取的邊未使生成樹t形成迴路,則加入te 否則捨棄,直到te中包含 n 1 條邊為止...