前言
设G=(V,E)是一个无向连通图,求再G的所有生成树中,代价最小的生成树。
算法思路
- 输入:一个加权连通图,其中顶点集合为V,边集合为E;
- 初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
- 重复下列操作,直到Vnew = V:
- 在集合E中选取权值最小的边****,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
- 将v加入集合Vnew中,将****边加入集合Enew中;
 
- 输出:使用集合Vnew和Enew来描述所得到的最小生成树。
源代码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 
 | #include<stdio.h>#define n 6
 
 typedef struct
 {
 int fromvex,endvex;
 int length;
 } edge;
 
 int dist[n][n];
 edge T[n-1];
 
 void input()
 {
 int i,j;
 for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
 {
 scanf("%d",&dist[i-1][j-1]);
 }
 }
 
 
 void PRIM()
 {
 int j,k,m,v,min,max=10000;
 int d;
 edge e;
 for(j=1;j<n;j++)
 {
 T[j-1].fromvex=1;
 T[j-1].endvex=j+1;
 T[j-1].length=dist[0][j];
 }
 for(k=0;k<n-1;k++)
 {
 min=max;
 for(j=k;j<n-1;j++)
 {
 if(T[j].length<min)
 {
 min=T[j].length;
 m=j;
 }
 }
 e=T[m];T[m]=T[k];T[k]=e;
 v=T[k].endvex;
 printf("The %d edge: %d---%d ,cost: %d\n",k+1,T[k].fromvex,T[k].endvex,T[k].length);
 for(j=k+1;j<n-1;j++)
 {
 d=dist[v-1][T[j].endvex-1];
 if(d<T[j].length)
 {
 T[j].length=d;
 T[j].fromvex=v;
 }
 }
 }
 }
 
 int main()
 {
 input();
 PRIM();
 return 0;
 }
 
 
 
 
 
 
 
 
 
 
 | 
运行结果
