Kruskal算法适用于边稀疏的情形
Prim算法适用于边稠密的情形
点击:Kruskal算法的理解
书上的代码:
n:图G上的顶点
e:G上的边数
vest:看是否属于同一连通分量的数组,数值相等则是。
该算法只适用于边数较少的带权无向连通图的最小生成树
typedef struct
{
int vex1; //边的起始顶点
int vex2; //边的终止顶点
int weight; //边的权值
}KEdge;
void Kruskal(KEdge E[], int n, int e)
{
int i, j, m1, m2, sn1, sn2, k;
int vest[MaxVertexNum]; //用于记录数组是否属于同一集合的辅助数组
for(i=0; i<n; i++) //初始化数组
vest[i] = i;
k = 0; //表示当前结构最小生成树的第 k条边 初始值为0
j = 0; //E中边的下标 初始值为0
for(j=0; j<e; j++)//生成的边数小于 e时继续循环
{
m1 = E[j].vex1; m2 = E[j].vex2; //取得一条边的两个邻接点
sn1 = vest[m1]; sn2 = vest[m2]; //分别得到两个顶点所属的集合编号
if(sn1 != sn2) //两顶点分别属于不同的集合, 该边是最小生成树的一条边
{
printf("(%d, %d):%d\n", m1, m2, E[j].weight);
k++; //生成的边数加 1
if(k == n-1) break;
for(i=0; i<n; i++) //修改集合编号相同
if(vest[i] == sn1)
vest[i] = sn2;
}
}
}
点击:Prim算法的理解