今天小孱弱弱像往常一样码,克鲁斯卡尔算法中的边集数组,由于比较冷门,网上几乎找不到邻接矩阵转化边集数组的信息,于是小孱弱鼓起勇气写一篇,帮助有需要的人。
为了保证时间复杂度不能太高,我们在遍历邻接矩阵时,由于是无向图,我们只需遍历左下三角形就ok,瞬间复杂度降低一大块,再往下,使用简单的冒泡排序将结构体按照权值排好。其实还有可以改进的地方,这只是做参考,希望帮到大家!
//邻接矩阵转化边集数组
void TransEdge(Edge edges[],MGraph *G)
{
int i,j,k;
for(i=0;i<G->numVertexes;i++)
for(j=0,k=0;j<G->arc[i][j]!=0;j++,k++)
{
if(G->arc[i][j]!=0&&G->arc[i][j]<INFINITY)
{
edges[k].begin=i;
edges[k].end=j;
edges[k].weight=G->arc[i][j];
}
}
//按照权排序(冒泡)
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
{
if(edges[i].weight>edges[j].weight)
{
Edge T;
T=edges[i];edges[i]=edges[j];edges[j]=T;
}
}
}