该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
程序可以运行,但是输入一半时会停止运行,极少数时能成功运行。
#include
#define MaxVertexNum 100 //最大顶点个数
#define M 30
typedef enum{FALSE,TRUE}Boolean;
Boolean visited[MaxVertexNum]; //访问标志数组
typedef char VertexType;
typedef int EdgeType;
typedef struct Lnode
{
int w;//相应一条边的权值
}Link;
typedef struct
{
VertexType vexs[MaxVertexNum];//顶点表
Link edges[MaxVertexNum][MaxVertexNum]; //图中当前的相连接的两个顶点
int n,e;//图中当前的顶点数和边数
}MGraph;
typedef struct
{
char data;
int jihe;
}VEX;
typedef struct
{
int vexh,vext;//边顶点
int weight;//权值
int flag;//标记
}EDGE;
EDGE e[M];
int p=0;
/*************************图邻接矩阵的建立**************************/
MGraph CreateMGraph()
{
MGraph G;
int i,j,k,ch3;
char ch1,ch2;
printf("请输入该图的顶点数和边数:\n");
scanf("%d,%d",&(G.n),&(G.e));
while(G.e>(G.n-1)*G.n/2)
{
printf("输入错误,请重新输入:\n");
scanf("%d,%d",&(G.n),&(G.e));
}
printf("请输入该图的顶点信息:\n");
for(i=1;i<=G.n;i++)
{
getchar();
scanf("%c",&(G.vexs[i]));
}
for(i=1;i<=G.n;i++)
for(j=1;j<=G.n;j++)
G.edges[i][j].w=0;
printf("请输入该图每条边对应的两个顶点的名称:\n");
for(k=1;k<=G.e;k++)
{
scanf("%c",&ch1);
printf("请输入第%d条边的顶点序号:",k);
scanf("%c %c",&ch1,&ch2);
printf("请输入第%d条边的权值大小:",k);
scanf("%d",&ch3);
for(i=1;ch1!=G.vexs[i];i++);
for(j=1;ch2!=G.vexs[j];j++);
e[p].vexh=i;
e[p].vext=j;
e[p].weight=G.edges[i][j].w=ch3; //权值
e[p].flag=0;
p++;
}
return G;
}
/*************************克鲁斯卡尔最小生成树*************************/
void minitree_KRUSKAL(MGraph *G)
{
int i,min,j,k;
VEX t[M];
for(i=1;i<=G->n;i++)
{
t[i].data=G->vexs[i];
t[i].jihe=i;
}
i=1;
while (in)
{
min=MaxVertexNum;
for (j=0;je;j++)
{
if (e[j].weight
{
min=e[j].weight;
k=j;
}
}
if (t[e[k].vexh].jihe!=t[e[k].vext].jihe)
{
e[k].flag=1;
for (j=1;j<=G->n;j++)
if (t[j].jihe==t[e[k].vext].jihe)
t[j].jihe=t[e[k].vexh].jihe;
t[e[k].vext].jihe=t[e[k].vexh].jihe;
i++;
}
else e[k].flag=2;
}
printf("克鲁斯卡尔最小生成树:\n");
for (i=0;ie;i++)
if (e[i].flag==1)
printf("(%d,%d) %d\n",e[i].vexh,e[i].vext,e[i].weight);//输出最小生成树
}
/****************************主函数调用**********************************/
int main()
{
MGraph G;
printf("\n");
printf("**********************************************************\n");
printf("*** 克鲁斯卡尔算法求图的最小生成树 ***\n");
printf("**********************************************************\n");
G=CreateMGraph();//建立该图的邻接矩阵
minitree_KRUSKAL(&G);//克鲁斯卡尔算法最小生成树
return 0;
}