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;
}