如果顶点在不同连通分量则不形成回路
struct b
{
char head;
char tail;
int lowcost;
};
bool cmp(b b1,b b2)
{
if(b1.lowcost<b2.lowcost)
{
return true;
}
else return false;
}
void kruskal(graph g)
{
const int arcnum1=g.arcnum;
b edge[arcnum1];//记边
int i,j,k;
int vexset[mvnum];//记录每个点所在连通分量
for(i=0,k=0;i<g.vexnum;i++)
{
vexset[i]=i;
for(j=i+1;j<g.vexnum;j++)
{
if(g.arcs[i][j]>0 &&g.arcs[i][j]<maxint)
{
edge[k].head=g.vexs[i];
edge[k].tail=g.vexs[j];
edge[k].lowcost=g.arcs[i][j];
k++;
}
}
}//存入相关信息
sort(edge,edge+arcnum1,cmp);//排序
//排序
//3、Sort函数有三个参数:(第三个参数可写,可不写)
//(1)第一个是要排序的数组的起始地址。
//(2)第二个是结束的地址下一位(最后一位要排序的地址)
//(3)第三个参数是排序的方法(一般为一个函数),可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
for(i=0;i<g.arcnum;i++)
{
int v1=locate(g,edge[i].head);//获取始点下标
int v2=locate(g,edge[i].tail);//获取终点下标
int vs1=vexset[v1];//v1所在联通分量
int vs2=vexset[v2];//v2所在连通分量
if(vs1!=vs2)
{
cout<<edge[i].head<<" "<<edge[i].tail<<" "<<edge[i].lowcost<<endl;
for(j=0;j<g.vexnum;j++)
{
if(vexset[j]==vs2)
{
vexset[j]=vs1;//合并分量,统一编号
}
}
}
}
}