prime算法求最小生成图

来源:互联网 发布:000webhost绑定域名 编辑:程序博客网 时间:2024/06/05 20:13

1.代码

#include#include # define MAX_VEX 100//以数字代替顶点//创建邻接矩阵 int create(int cost[][MAX_VEX]){int i, j, v1, v2, w, vexnum, edgnum;printf("输入顶点数和边数: ");//确定数值有助于节省空间,方便代码书写scanf("%d, %d", &vexnum, &edgnum); //初始化,32767代表无穷 for(i=1; i<=vexnum; i++)for(j=1; j<=vexnum; j++)cost[i][j]=31767; printf("依次输入v1、v2及其权值w并以,隔开\n");for(i=1;i<=edgnum;i++){scanf(" %d, %d, %d",&v1,&v2,&w);//v1!=v2cost[v1][v2]=w;//建立无序图,加上以下一句cost[v2][v1]=w; }return vexnum;} //prim算法求最小生成树 void prim(int cost[][MAX_VEX], int vexnum){//从第k个顶点开始int i, j, k, bvex, min, locmin;//int lowcost[vexnum+1], closevext[vexnum+1];printf("prim算法最小生成树\n输入开始节点: ");scanf("%d", &bvex);//lowcost用于存储vexnum个权值,以便找出最小者 for(k=1;k<=vexnum;k++){lowcost[k]=cost[bvex][k];closevext[k]=bvex;//默认为起始节点 }closevext[bvex]=-1;//选入集合U for(i=1;i<=vexnum;i++){locmin=0, min=31767;//1,不在U内; 2,权值最小 for(j=1;j<=vexnum;j++)//定位V中距离U最近的顶点locmin if(closevext[j]!=-1&&lowcost[j]<min){min=lowcost[j];locmin=j;}if(locmin){printf("(%d,%d)%2d\n", closevext[locmin], locmin, min );closevext[locmin]=-1;//顶点locmin加入集合U //由于locmin的加入, 可能需要修改数组lowcost for(k=1;k<=vexnum;k++)if(closevext[k]!=-1&&cost[locmin][k]<lowcost[k]){lowcost[k]=cost[locmin][k];closevext[k]=locmin;//默认节点的修改,影响输出语句 }}}} int main(){int cost[MAX_VEX][MAX_VEX];int vexnum=create(cost);prim(cost, vexnum); return 0;}

2.结果