kruskal生成树算法问题

来源:百度知道 编辑:UC知道 时间:2024/09/28 11:03:28
我现在得到了一个矩阵int recnode[40000];其中按奇偶两两一组。如recnode[0]和recnode[1]表示这两个数对应的一组权值是最小的。(recnode[3]recnode[2]>recnode[1]-recnode[0])以此类推。现在我要用最小生成数将这20000组边 生成一棵树。用kruskal算法 该怎么做。我用的是当recnode中的一组节点(奇偶的一对数)要能成为树中的一条边时,如果该两个节点号都出现在了已经部分生成的树中时,则判断为回路。但是后来在程序中发现仅仅有这个条件还不能生成一颗完整的树。因为如假设(1,3)(3,4)和(6,10)(10,7)这两组已经在生成树的矩阵中时,新来的一组节点如(4,6)很显然能进入生成树中间,但以两个节点都在生成树的矩阵中作为生成树的条件显然是错误的。那我具体应该怎么判断呢?请各位指教。谢谢!

/*
Name:最小生成树kruskal算法
Author:wujilin
Description:用邻接矩阵做图
Date: 21-07-06 23:07
Copyright:wujilin
*/

#include<stdio.h>
#include<stdlib.h>
#define M 20
#define MAX 20

typedef struct
{
int begin;
int end;
int weight;
}edge;

typedef struct
{
int adj;
int weight;
}AdjMatrix[MAX][MAX];

typedef struct
{
AdjMatrix arc;
int vexnum, arcnum;
}MGraph;
void CreatGraph(MGraph *);//函数申明
void sort(edge* ,MGraph *);
void MiniSpanTree(MGraph *);
int Find(int *, int );
void Swapn(edge *, int, int);
void CreatGraph(MGraph *G)//构件图
{
int i, j,n, m;

printf("请输入边数和顶点数:");
scanf("%d %d",&G->arcnum,&G->vexnum);

for (i = 1; i <= G->vexnum; i++)//初始化图
{
for ( j = 1; j <= G->vexnum; j++)
{