普里姆(Prim)求最小生成树
一、普里姆(Prim)算法
1.基本思想:設G=(V, E)是具有n個頂點的連通網,T=(U, TE)是G的最小生成樹, T的初始狀態為U={u0}(u0∈V),TE={},重復執行下述操作:在所有u∈U,v∈V-U的邊中找一條代價最小的邊(u, v)并入集合TE,同時v并入U,直至U=V。即:
???? (1)從連通網絡 G = { V, E }中的某一頂點 u0 出發,選擇與它關聯的具有最小權值的邊(u0, v),將其頂點加入到生成樹的頂點集合U中。
(2)以后每一步從一個頂點在U中,而另一個頂點不在U中的各條邊中選擇權值最小的邊(u, v),把它的頂點加入到集合U中。如此繼續下去,直到網絡中的所有頂點都加入到生成樹頂點集合U中為止。
2、示例:
3、實現代碼如下:
#include "stdio.h" #include "stdlib.h" #define MAX 110 int a[MAX][MAX],p[MAX];int main(void) {int i,j,k,n,t,min,sum,new_point,x,y,d;printf("請輸入頂點的個數:");scanf("%d",&n);t=n*(n-1)/2;memset(p,0,sizeof(p)); //將p數組初始化為0printf("請輸入每條邊的起始端點、權值:/n");for(i=0;i<t;i++){scanf("%ld%ld%ld",&x,&y,&d); //輸入每條邊的權值a[x][y]=a[y][x]=d;}p[1]=1;sum=0;for(k=0;k<n-1;k++){min=-1;for(i=1;i<=n;i++){if(p[i]==1){for(j=1;j<=n;j++){if(p[j]==0 && (min==-1 || min>a[i][j])){min=a[i][j]; //從一個頂點在U中,而另一個頂點不在U中的各條邊中選擇權值最小的邊new_point=j;}}}}p[new_point]=1;sum+=min;}printf("最小生成樹的權值為:%d/n",sum);system("pause");return 0; }
?
總結
以上是生活随笔為你收集整理的普里姆(Prim)求最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 克鲁斯卡尔(Kruskal)算法求最小生
- 下一篇: 判断给定的二叉树是否为二叉排序树