求大神帮忙,最小生成树输出有问题,,,在线等
#include <stdio.h>#define MaxInt 32767
#define MVNum 100
#define OK 1
typedef char VerTexType; //假设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型
typedef struct{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前点数和边数
}AMGraph;
//辅助数组Edges的定义
struct{
VerTexType Head; //边的始点
VerTexType Tail; //边的终点
ArcType lowcost; //边上的权值
}Edge[(MVNum*(MVNum -1))/2];
int Vexset[MVNum]; //辅助数组Vexset的定义
int LocateVex(AMGraph G,VerTexType v)
{
//确定点v在G中的位置
int i;
for(i=0;i<G.vexnum;++i)
{
if(G.vexs[i]==v)
return i;
}
}
int CreateUND(AMGraph G)
{
//采用邻接矩阵表示法,创建无向网G
int i,j,k;
VerTexType v1=0,v2=0;
ArcType w;
scanf("%d",&G.vexnum);
G.arcnum=G.vexnum*G.vexnum;
for(i=0;i<G.vexnum;++i) //初始化邻接矩阵
for(j=0;j<G.vexnum;++j)
G.arcs[i][j]=MaxInt;
Sort(G);
for(k=0;k<G.arcnum;++k) //构造邻接矩阵
{
scanf("%d",&w);
v1++;
v2++;
i=LocateVex(G,v1); //调用函数,确定v1在G中的位置
j=LocateVex(G,v2); //调用函数,确定v2在G中的位置
G.arcs[i][j]=w;
}
}
int Sort(AMGraph G){
int m=G.arcnum-2;
int flag = 1;
while((m > 0) && flag == 1){
flag = 0;
int j;
for(j=0;j<=m;j++){
if(Edge[j].lowcost > Edge[j+ 1].lowcost){
flag = 1;
VerTexType temp_Head = Edge[j].Head;{
Edge[j].Head = Edge[j+ 1].Head;
Edge[j + 1].Head = temp_Head;
VerTexType temp_Tail = Edge[j].Tail;
Edge[j].Tail = Edge[j+ 1].Tail;
Edge[j + 1].Tail = temp_Tail;
ArcType temp_lowcost = Edge[j].lowcost;
Edge[j].lowcost = Edge[j+ 1].lowcost;
Edge[j + 1].lowcost = temp_lowcost;
}//if
}//for
--m;
}//while
}//Sort
}
void MiniSpanTree_Kruskal(AMGraph G){
//无向网G以邻接矩阵形式存储,构造G的最小生成树T,输出T的各条边
int i , j , v1 , v2 , vs1 , vs2;
Sort(G); //将数组Edge中的元素按权值从小到大排序
for(i = 0; i < G.vexnum; ++i) //辅助数组,表示各顶点自成一个连通分量
Vexset[i] = i;
for(i = 0; i < G.arcnum; ++i){
//依次查看排好序的数组Edge中的边是否在同一连通分量上
v1 =LocateVex(G, Edge[i].Head); //v1为边的始点Head的下标
v2 =LocateVex(G, Edge[i].Tail); //v2为边的终点Tail的下标
vs1 = Vexset[v1]; //获取边Edge[i]的始点所在的连通分量vs1
vs2 = Vexset[v2]; //获取边Edge[i]的终点所在的连通分量vs2
if(vs1 != vs2){ //边的两个顶点分属不同的连通分量
printf("%d%d\n",Edge[i].Head,Edge[i].Tail); //输出此边
for(j = 0; j < G.vexnum; ++j) //合并vs1和vs2两个分量,即两个集合统一编号
if(Vexset[j]==vs2) Vexset[j] = vs1; //集合编号为vs2的都改为vs1
}//if
}//for
}//MiniSpanTree_Kruskal
int main()
{
AMGraph G;
CreateUND(G);
MiniSpanTree_Kruskal(G);
}
[ 本帖最后由 wu2304211 于 2015-7-2 10:55 编辑 ]