最小代价生成树——Kruskal算法

本文详细介绍了使用边集数组存储图结构,并通过Parent数组辅助处理连通分量,实现图的连通性判断及最小生成树(MST)构建的算法过程。通过对边集排序和逐一检查,确保生成树中各顶点间的连通性,避免形成环路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.图的存储结构
采用边集数组存储图。
2.定义Parent[i]数组,辅助完成连通分量的处理。数组分量的值表示顶点i的双亲结点(初值为-1)
当一条边(u,v)的两个顶点的根结点不同时,这两个结点属于不同的连通分量(利用parent数组查找一棵树的根节点。当一个结点n的parent==-1,树的根节点即为n)
来判断一条边所依附的两个顶点在同一个连通分量中
3.将一条边所依附的两个顶点合并到同一个连通分量中要进行连通分量的合并,其中一个顶点所在树的根节点为vex1,令一个顶点所在的树的根节点为vex2,则:parenr[vex2]=vex1;
算法分析:
1.初始化parent数组,定义计数器count(记录加入到生成树中的顶点的个数);
2.对边集数组进行排序
3.依次考察边集数组中的每一条边(u,v)
3.1确定u所在的树的根节点vex1;
3.2确定v所在的树的根节点vex2;
3.3如果vex1!=vex2;,则进行
a。parent[vex2]=vex1;//将第一个结点的父亲设为第二个结点的父亲,合并为一个连通分量
b.count++;
c.如果count==n-1,算法结束 。

int main()
		{
				int arcNum,int vertexNum;
				EdgeNode *edge;
				int *parent;
				cout<<"Please input the number of vertexNum:";
				cin>>vertexNum;
				cout<<"Please input the number of edges:";
				cin>>arcNum;
				edge=new EdgeNode[arcNum];
				parent=new int [vertexNum];
				for(int i=0li<arcNum;++i)
				{
						cout<<"Please input the edges";
						cin>>edge[i].form>>edge[i].to>>edge[i].weight;
				}
				sort(edges,G);
				for(int i=0;i<vertexNum;++i)
				parent[i]=-1;//每个结点分属于不同的集合
				int k=0,begin,end,count=0;
				cout<<"next is the MST:"<<endl;
				for(int k=0;k<arcNum,++k)
				{
						int begin=edge[k].form;int end=edge[k].to;
						int m,n;
						m=Find(parent,begin);
						n=Find(parent,end);
						if(m!=n)
						{
								
								cout<<begin<<"."<<end<<","<<edge[k].weight<<endl;
								parent[n]=m;count++;
								if(count==vertexNum-1)
								break;
						}
				}
				return 0;
		}
		int Find(int *parent,int node)
		{
			int f;
			f=node;
			while(parent[f]>-1)
			f=parent[f];
			return f;
		}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值