自己写的Kruskal算法,不知道哪里错了

HZChang 2011-12-07 09:25:00
各位能告诉我下面的代码哪里错了么,为什么运行结果不正确啊
#include<stdio.h>
#include<stdlib.h>
#define MAXV 6
#define INF 32767
#define MaxSize 30
typedef struct
{
char no;
int info;
}VexterTyoe;
typedef struct
{
int edges[MAXV][MAXV];
int n,e;
VexterTyoe info;
}MGraph;

typedef struct
{
int u;
int v;
int w;
}Edge;

void Kruskal(MGraph *g);
void InsertSort(Edge E[],int e);

void main()
{
int i,j,e=0;
MGraph g;
g.n=6;
int A[MAXV][MAXV]={{0,6,1,5,INF,INF},{6,0,5,INF,3,INF},{1,5,0,5,6,4},{5,INF,5,0,INF,2},{INF,3,6,INF,0,6},{INF,INF,4,2,6,0}};
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
{
g.edges[i][j]=A[i][j];
if(A[i][j]!=0&&A[i][j]!=INF)
e++;
}
g.e=e/2;
Kruskal(&g);
}

void Kruskal(MGraph *g)
{
int i,j,u1,v1,k; //i和j分别为边的两顶点的下标
int sn1,sn2; //sn1和sn2为起始顶点与终端顶点的集合
int vset[MAXV]; //存储两顶点是否连通的标志
Edge E[MaxSize]; //存放图的所有边
k=0; //e数组的下标

for(i=0;i<g->n;i++) //将所有边存放到E中
for(j=0;j<g->n;j++)
if(g->edges[i][j]!=0&&g->edges[i][j]!=INF)
{
E[k].u=i;E[k].v=j;E[k].w=g->edges[i][j];
k++;
}

InsertSort(E,g->e);

for(i=0;i<g->n;i++)
vset[i]=i;

k=1;
j=0;

while(k<g->n)
{
u1=E[j].u;v1=E[j].v;
sn1=vset[u1];
sn2=vset[v1];
if(sn1!=sn2)
{
printf(" (%d,%d):%d\n",u1,v1,E[j].w);
k++;
for(i=0;i<g->n;i++)
if(vset[i]==sn2)
vset[i]=sn1;
}
j++;
}
}

void InsertSort(Edge E[],int e)
{
int i,j;
Edge temp;
for(i=0;i<e;i++)
{
temp=E[i];
j=i-1;
while(j>=0&&temp.w<E[j].w)
{
E[j+1]=E[j];
j--;
}
E[j+1]=temp;
}
}
...全文
73 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧