分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!
1、基本思想:設無向連通網為g=(v, e),令g的最小生成樹為t=(u, te),其初態為u=v,te=,然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量;若被考察邊的兩個頂點屬於同乙個連通分量,則捨去此邊,以免造成迴路,如此下去,當t中的連通分量個數為1時,此連通分量便為g的一棵最小生成樹。
2、示例:
3、**實現如下:
[cpp]view plain
copy
print?
#include "stdio.h"
#include "stdlib.h"
struct edge
a[5010];
int cmp(const
void *a,const
void *b) //按公升序排列
int main(void)
} printf("最小生成樹的權值為:%d/n",min);
system("pause");
return 0;
}
#include "stdio.h"#include "stdlib.h"struct edgea[5010];int cmp(const void *a,const void *b) //按公升序排列int main(void){ int i,n,t,num,min,k,g,x[100]; printf("請輸入頂點的個數:"); scanf("%d",&n); t=n*(n-1)/2; for(i=1;i<=n;i++) x[i]=i; printf("請輸入每條邊的起始端點、權值:/n"); for(i=0;i
給我老師的人工智慧教程打call!
kruskal克魯斯卡爾演算法
給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.求最小生成樹的演算法 1 克魯斯卡爾演算法 圖的存貯結構採用 邊集陣列 且權值相等的邊在陣列中排列次序可以是任意的.該方法對於邊相對比較多的不是很實用,浪費時間 方法 將圖中邊按其權值由小到大的次序順序選取,...
克魯斯卡爾演算法 Kruskal
克魯斯卡爾 kruskal 演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g v,e 是乙個具有 n 個頂點的帶權連通圖,t u,t e 是g 的最小生成樹,則構造最小生成樹的步驟如下 1 設定 u的初值等於 v 即包含有 g中的全部頂點 te 的初值為空集 即圖 t 中每乙個...
克魯斯卡爾 Kruskal 演算法
設g v,e 是具有n個頂點的連通網,t u,te 是其最小生成樹。初值 u v,te 對g中的邊按權值大小從小到大依次選取。選取權值最小的邊 vi,vj 若邊 vi,vj 加入到te後形成迴路,則捨棄該邊 邊 vi,vj 否則,將該邊併入到te中,即te te 重複 直到te中包含有n 1條邊為止...