主题:[原创]怎么都调试不通,求救
用的是vc,从主函数输出数组元素总是-858993460,要自杀了。。。。
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define MAXVALUE 100 //定义最大的量
typedef int adjmatrix[10][10];
typedef int vertextype;
typedef struct
{
vertextype vex[10];
adjmatrix arcs; //邻接矩阵
int arcnum;
}mgraph;
void CreatGraph(mgraph g)
{
int i,j,k,w;
printf("请输入十个办公地点(用V1,V2,V3~V10表示)之间连线的数量:\n");
scanf("%d",&g.arcnum);
if(g.arcnum>=10)
goto lable;
else
{
printf("输入边数错误,请重新输入:\n");
scanf("%d",&g.arcnum);
}
lable:for(i=1;i<11;i++)
g.vex[i]=i; //构造顶点序列
for(i=1;i<11;i++)
for(j=1;j<11;j++)
g.arcs[i][j]=MAXVALUE; //初始化邻接矩阵
for(k=0;k<g.arcnum;k++)
{
loop:printf("请输入布线的起、终点的下标序号和对应的费用:\n");
scanf("%d %d %d",&i,&j,&w);//输入边的起、终点及其权值
if(i>g.arcnum||j>g.arcnum)
{
printf("输入错误,请重新输入:\n");
goto loop;
}
g.arcs[i][j]=g.arcs[j][i]=w; //给邻接矩阵赋值
}
}
void PrimMinSpanTree(mgraph g,int k) //用prim算法,从顶点Vk出发,构造图g的最小生成树T,输出T的各条边
{
int i,j,min,p;
struct
{
int adjvex;
int lowcost;
}closedge[10]; //定义从顶点集合U到V-U的代价最小的边的辅助数组closedge[]
for(j=1;j<=10;j++)
if (j!=k)
{
closedge[j].adjvex=k;
closedge[j].lowcost=g.arcs[k][j];
} //初始化辅助数组
closedge[k].lowcost=0; //初始化U={Vk}
for(i=1;i<10;i++) //选择其余9个办公室
{
p=1;
min=10000;
for(j=1;j<10;j++) //求出T的下一个顶点
if (closedge[j].lowcost!=0&&closedge[j].lowcost<min)
{
min=closedge[j].lowcost;
p=j;
} //选出最小权值的顶点Vp
printf("%d--%d: %d\n",closedge[p].adjvex,p,min); //输出最小边及其权值
closedge[p].lowcost=0; //将新的顶点Vp加到最小生成树T上,并入U集合
for(j=1;j<10;j++)
if (g.arcs[p][j]<closedge[j].lowcost)
{
closedge[j].lowcost=g.arcs[p][j];
closedge[j].adjvex=p; //重新选择最小边
}
}
}
void main()
{
int k1=3;
mgraph g;
CreatGraph(g);
printf("10个办公地点布线图的邻接矩阵:\n");
PrimMinSpanTree(g,k1);
system("pause");
} //main函数
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#define MAXVALUE 100 //定义最大的量
typedef int adjmatrix[10][10];
typedef int vertextype;
typedef struct
{
vertextype vex[10];
adjmatrix arcs; //邻接矩阵
int arcnum;
}mgraph;
void CreatGraph(mgraph g)
{
int i,j,k,w;
printf("请输入十个办公地点(用V1,V2,V3~V10表示)之间连线的数量:\n");
scanf("%d",&g.arcnum);
if(g.arcnum>=10)
goto lable;
else
{
printf("输入边数错误,请重新输入:\n");
scanf("%d",&g.arcnum);
}
lable:for(i=1;i<11;i++)
g.vex[i]=i; //构造顶点序列
for(i=1;i<11;i++)
for(j=1;j<11;j++)
g.arcs[i][j]=MAXVALUE; //初始化邻接矩阵
for(k=0;k<g.arcnum;k++)
{
loop:printf("请输入布线的起、终点的下标序号和对应的费用:\n");
scanf("%d %d %d",&i,&j,&w);//输入边的起、终点及其权值
if(i>g.arcnum||j>g.arcnum)
{
printf("输入错误,请重新输入:\n");
goto loop;
}
g.arcs[i][j]=g.arcs[j][i]=w; //给邻接矩阵赋值
}
}
void PrimMinSpanTree(mgraph g,int k) //用prim算法,从顶点Vk出发,构造图g的最小生成树T,输出T的各条边
{
int i,j,min,p;
struct
{
int adjvex;
int lowcost;
}closedge[10]; //定义从顶点集合U到V-U的代价最小的边的辅助数组closedge[]
for(j=1;j<=10;j++)
if (j!=k)
{
closedge[j].adjvex=k;
closedge[j].lowcost=g.arcs[k][j];
} //初始化辅助数组
closedge[k].lowcost=0; //初始化U={Vk}
for(i=1;i<10;i++) //选择其余9个办公室
{
p=1;
min=10000;
for(j=1;j<10;j++) //求出T的下一个顶点
if (closedge[j].lowcost!=0&&closedge[j].lowcost<min)
{
min=closedge[j].lowcost;
p=j;
} //选出最小权值的顶点Vp
printf("%d--%d: %d\n",closedge[p].adjvex,p,min); //输出最小边及其权值
closedge[p].lowcost=0; //将新的顶点Vp加到最小生成树T上,并入U集合
for(j=1;j<10;j++)
if (g.arcs[p][j]<closedge[j].lowcost)
{
closedge[j].lowcost=g.arcs[p][j];
closedge[j].adjvex=p; //重新选择最小边
}
}
}
void main()
{
int k1=3;
mgraph g;
CreatGraph(g);
printf("10个办公地点布线图的邻接矩阵:\n");
PrimMinSpanTree(g,k1);
system("pause");
} //main函数