Prim算法 Prim算法用于求无向图的最小生成树 设图G =(V,E),其生成树的顶点集合为U。 ①、把v0放入U。 ②、在所有u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树。 ③、把②找到的边的v加入U集合。如果U集合已有n个元素,则结束,否则继续执行②。 其算法的时间复杂度为O(n^2) Prim算法实现: (1)集合:设置一个数组set(i=0,1,..,n-1),初始值为 0,代表对应顶点不在集合中(注意:顶点号与下标号差1) (2)图用邻接矩阵表示,路径不通用无穷大表示,在计算机中可用一个大整数代替。INF=32767 采用堆可以将复杂度降为O(m log n),如果采用Fibonaci堆可以将复杂度降为O(n log n + m) code: #include<iostream.h> #include<stdio.h> #define INF 32767 struct MGraph{ int n; // 顶点个数 int edges[10][10]; }; void creatMGraph(MGraph &g) { int i,j,k,w; cout<<"输入图的顶点数:"<<endl; cin>>g.n; for(i=0;i<g.n;i++) for(j=0;j<g.n;j++) { if(i==j) g.edges[i][j]=0; else g.edges[i][j]=INF; } cout<<"依次顶点代表其所对应的边:"<<endl; //for(k=0;k<g.n;k++) //{ while(1) { cin>>i>>j>>w; if(w==0) break; //退出条件 else { g.edges[i][j]=w; g.edges[j][i]=w; } } //} } void prim(MGraph &g,int v) { int lowcost[INF]; int min; int closest[INF],i,j,k; for(i=0;i<g.n;i++) { lowcost[i]=g.edges[v][i]; //给lowcost[]和closest[]赋初值 closest[i]=v; } for(i=1;i<g.n;i++) //找出n-1个顶点 { min=INF; for(j=0;j<g.n;j++) //在(v-u)中找出离u最近的顶点k if(lowcost[j]!=0&&lowcost[j]<min) { min=lowcost[j]; //记录最近顶点的编号 k=j; } printf("边(%d,%d)权为:%d/n",closest[k],k,min); lowcost[k]=0; //标记k已经加入u for(j=0;j<g.n;j++) //修改数组lowcost和closest { if(g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j]) { lowcost[j]=g.edges[k][j]; closest[j]=k; } } } } int main() { MGraph g; creatMGraph(g); int v; printf("请输入起始定点:"); cin>>v; prim(g,v); return 0; } 样例输入: