数据结构之---C语言实现最小生成树之kruskal(克鲁斯卡尔)算法

//Kruskal(克鲁斯卡尔)算法
//杨鑫
#include 
#include 
#define MAX 1000
#define MAXE MAX
#define MAXV MAX
typedef struct
{
	int beginvex1;                     //边的起始顶点
	int endvex2;                      //边的终止顶点
	int weight;                    //边的权值
}Edge;

void kruskal(Edge E[],int n,int e)
{ 
		int i,j,m1,m2,sn1,sn2,k;
		int vset[MAXV];
		for(i=1;i<=n;i++) 			//初始化辅助数组
		{
			vset[i]=i;	
		}		
  		k=1;        			//表示当前构造最小生成树的第k条边,初值为1
  		j=0;                   	//E中边的下标,初值为0
		while(k < e)            //判断是否加入了最小生成树中
		{
       		m1=E[j].beginvex1;
       		m2=E[j].endvex2;     //取一条边的两个邻接点
			sn1=vset[m1];
			sn2=vset[m2];       //分别得到两个顶点所属的集合编号
			if(sn1 != sn2)     //判断是否有回路
			{
					printf("(v%d,v%d): %d\n",m1,m2,E[j].weight);
					k++;                //生成边数增l
					if(k>=6)  
							break;
					for(i=1;i<=n;i++) //两个集合统一编号
					{
						 if (vset[i]==sn2)  //集合编号为sn2的改为sn1
								 vset[i]=sn1;
					}
         }

你可能感兴趣的:(数据结构,算法)