【Kruskal算法】基于Kruskal算法的最小生成树构建-C++

  算法为本人的课程设计,算法包含无向图的邻接矩阵构建,输出,之后将kruskal算法结果输出。

#include <stdio.h>
#define MaxInt 32767                    	//表示极大值,即∞
#define MVNum 20                       	//最大顶点数 
typedef int VerTexType;              	//假设顶点的数据类型为整型 
typedef int ArcType;                  	//假设边的权值类型为整型 
struct EData{							//边结构体的集合 
	int start;							//边的起点 
	int end;							//终点 
	int weight;							//权值 
};
struct AMGraph{ 
  VerTexType vexs[MVNum];            		//顶点表 
  ArcType arcs[MVNum][MVNum];      	//邻接矩阵 
  int vexnum,arcnum;                		//图的当前点数和边数 
  struct EData edage[MVNum];				//边的集合 
  
}; 

 int LocateVex(AMGraph G,VerTexType u)
 {//存在则返回u在顶点表中的下标;否则返回-1
   int i;
   for(i=0;i<G.vexnum;++i)
     if(u==G.vexs[i])
       return i;
   return -1;
 }
 int  Find(int *parent,int f)//判断源头 
 {
 	while(parent[f] > 0)
 	{
	 	f=parent[f];
	}
	return f;
 }
 void SortEData(AMGraph &G)//边排序 
 {
 	int i,j;
 	EData temp;
 	for(i=0;i<G.arcnum-1;i++)
 		for(j=0;j<G.arcnum-i-1;j++)
 			if(G.edage[j].weight>G.edage[j+1].weight)
 			{
				temp=G.edage[j+1];
 				G.edage[j+1]=G.edage[j];
 				G.edage[j]=temp;
 			}
 		
 }
void CreateUDN(AMGraph &G){ 
    //采用邻接矩阵表示法,创建无向网G 
    int i,j,k,w;
	int v1,v2;
	printf("请输入顶点个数和边数,并用逗号隔开:");
	scanf("%d,%d",&G.vexnum,&G.arcnum);//输入总顶点数,总边数 
    getchar();
	printf("请输入各个顶点:");
	for(i = 0; i<G.vexnum; ++i)    
	{
		printf("请输入第%d个顶点:",i+1);
		scanf("%d",&G.vexs[i]);       	//依次输入顶点的信息 
		getchar();
	}
	for(i = 0; i<G.vexnum;++i) 	//初始化邻接矩阵,边的权值均置为极大值
       for(j = 0; j<G.vexnum;++j)   
         G.arcs[i][j] = MaxInt;  
	   printf("请输入每条边信息:");
    for(k = 0; k<G.arcnum;k++){   //构造邻接矩阵 
      printf("请输入第%d条边的信息:",k+1);
	  scanf("%d,%d,%d",&v1,&v2,&w);//输入一条边依附的顶点及权值 
      getchar();
      G.edage[k].start=v1;
	  G.edage[k].end=v2;
	  G.edage[k].weight=w;
	  i = LocateVex(G, v1); 
      j = LocateVex(G, v2);          //确定v1和v2在G中的位置
      G.arcs[i][j] = w;                   //边<v1, v2>的权值置为w 
      G.arcs[j][i] = G.arcs[i][j];    //置<v1, v2>的对称边<v2, v1>的权值为w 
   }
} 
void Kruskal(AMGraph &G)
{
	int i,j,n,m;
	int parent[MVNum];
	AMGraph T;
	SortEData(G);
	for(i=0;i<=G.vexnum;i++)//判断源头集合 
	{
		parent[i]=0;
	}
	printf("kruskal算法结果为:(顶点,顶点)权值\n"); 
	for(i=0;i<G.arcnum;i++)
	{
		n=Find(parent,G.edage[i].start);
		m=Find(parent,G.edage[i].end);
		if(n!=m)
		{
			parent[n]=m;
			printf("(%d,%d) %d\n",G.edage[i].start,G.edage[i].end,G.edage[i].weight);
		}
	}	
	
}
int main()
{
	int i,j;
	AMGraph G;
	CreateUDN(G);
	for(i = 0; i<G.vexnum;++i)
	{//输出邻接矩阵信息
       for(j = 0; j<G.vexnum;++j)
		   printf("%10d",G.arcs[i][j]);
	   printf("\n");
	   }
	Kruskal(G);
	return 0; 
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值