最小生成樹的演算法思想和介面介紹過的求單源的最短路徑演算法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中任意一點的權值最小,此...