printf(\请输入节点%d到节点%d的权:\scanf(\将输入临时存放在temp while(temp==0||temp<-1) //过滤输入数据 { }
if(temp>0) //将符合要求数据赋值给temp x.v[i][j]=temp;
printf(\输入有误,请重新输入:\\n\printf(\请输入%d到%d的权:\scanf(\
else //temp=-1时将权重赋值最大值88
x.v[i][j]=maxvalue; }
else //i>j由于权重是对称的即呈上三角或下三角分布故只
需将i,j对换即可 }
void print(mgraph g,int n) //打印函数 {
int i,j; //定义整型i,j printf(\打印美观需要 for(i=1;i<=n;i++)
printf(\
}
return x; //返回图x
}
printf(\
x.v[i][j]=x.v[j][i];
}
printf(\
for(i=1;i<=n;i++) //双层循环按矩阵方式打印输出各节点间权值 {
printf(\
for(j=1;j<=n;j++) }
printf(\
printf(\
void prim(mgraph g,int k,int n) //核心算法Prim算法实现函数 {
int i,j,min,p; //定义整型变量i,j用于循环 min和p分别用于临时存放最小权值
及其下标
struct //定义型类型数据closedge[]用于临时存放下标和最小边 {
int adjvex; int lowcost;
}closedge[maxnum];
for(i=1;i<=n;i++) //初始化辅助数组
if(i!=k) { }
closedge[k].lowcost=0; //将节点加入生成树中
for(i=1;i closedge[i].adjvex=k; closedge[i].lowcost=g.v[k][i]; 并打印输出 { p=1; //初始化p min=maxvalue; //初始化最小权值 for(j=1;j<=n;j++) //循环n次比较最小权值 if(closedge[j].lowcost!=0&&closedge[j].lowcost { min=closedge[j].lowcost; //替换最小权 值为当前节点的权值 } printf(\打印 p=j; //记录该节点下标 最小的权值的下标和最小边 } int main() //主函数 { int n,start; //定义整型n,start表示节点数和开始节点 printf(\请输入节点数(不大于10):\scanf(\ mgraph red; //定义图red closedge[p].lowcost=0; //将该节点加入生成树中 for(j=1;j<=n;j++) //刷新临时存放空间 } if((g.v[p][j]) < (closedge[j].lowcost)) { } closedge[j].lowcost=g.v[p][j]; //赋值最小边 closedge[j].adjvex=p; //赋值最小边对应下标 } red=input(n); //调用输入函数用户输入数据 print(red,n); //调用输出函数打印输出所输入的数据 printf(\请输入开始节点:\scanf(\ prim(red,start,n); //调用prim函数实现prim算法求最小生成树 return 0;