最小生成樹之prim演算法

2021-06-18 03:26:01 字數 1559 閱讀 8799

最小生成樹的演算法思想和介面介紹過的求單源的最短路徑演算法dijkstra演算法有很多相似地方,甚至很多**都是一樣。prim演算法要解決的主要問題是路徑的最短問題。假設平面上有很多點,各個點之間有很多的線連線起來,並且到達各個點的距離不相同,需要求出一條路徑,使得各個點都能被連線起來,並且他們的距離最短。

還是拿講解dijkstra演算法的那張圖來看,現在的這個圖是乙個無向圖,這是給dijkstra演算法的一大區別,在dijkstra中我們的圖是乙個有方向的,而在我們求最小連線路徑的時候是沒有方向的。

下面看下c**的實現:

# include # define int_max 1000000

# define max 100

typedef structgraph;

void prim(graph * g,int * least, int * path);

int main(void)

} g.n = 6;

g.e = 8;

//人為的構造每條邊,並且預設0的頂點為起點

//這裡是給dijkstra的乙個區別,因為是無向圖,所以兩邊都需要賦值

g.g[0][1] = 10;

g.g[0][5] = 20;

g.g[0][3] = 98;

g.g[1][2] = 18;

g.g[2][3] = 34;

g.g[5][4] = 22;

g.g[5][3] = 7;

g.g[4][3] = 13;

g.g[1][0] = 10;

g.g[5][0] = 20;

g.g[3][0] = 98;

g.g[2][1] = 18;

g.g[3][2] = 34;

g.g[4][5] = 22;

g.g[3][5] = 7;

g.g[3][4] = 13;

prim(&g,least,path);

}void prim(graph * g,int * least, int * path);

for(i=0;in;i++)else

path[i] = 0; //讓預設的所有邊的上乙個頂點都為圖中的第0個頂點

}visited[0] = 1; //第0個頂點已經被訪問

for(i=1;in;i++)

}printf("%d->%d %d\n",path[temp],temp,min); //列印最短邊的開始和結束點,和邊的長度

sum += min; //總共的長度

visited[temp] = 1; //最短路徑的這個結束頂點也被訪問

//更新當前頂點temp到其它頂點的最小路徑長度

for(j=0;jn;j++)}}

printf("最短路徑為:%d",sum);

}

程式最終執行結果:

0->1  10

1->2  18

0->5  20

5->3  7

3->4  13

最短路徑為:68

最小生成樹之prim演算法

普利姆演算法 prim algorithm 最小生成樹的概念 所謂最小生成樹,就是在乙個具有n個頂點的帶權連通圖g中,如果存在某個子圖g 其包含了圖g中的所有頂點和一部分邊,且不形成迴路,並且子圖g 的各邊權值之和最小,則稱g 為圖g的最小生成樹。普利姆演算法 prim algorithm 演算法描...

最小生成樹之prim演算法

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...

最小生成樹之Prim演算法

mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從點的方面考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小,此...