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!=v2
cost[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.结果