/*********************************************
****************prim算法**********************
**********************************************/
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX]; //保存相关顶点下标
int lowcost[MAXVEX]; //保存相关顶点间边的权值
lowcost[0] = 0; //V0作为最小生成树的根开始遍历, 权值为0
adjvex[0] = 0; //V0第一个加入
//初始化操作
for (i=1; i<G.numVertexes; i++)
{
lowcost[i] = G.arc[0][i]; // 将邻接矩阵第0行所有权值先加入数组
adjvex[i] = 0; // 初始化全部先为VO的下标
}
//生成最小生成树全过程
for (i=1;i < G.numVertexes; i++)
{
min = INFINITY; //初始化为不可能的值
j = 1;
k = 0;
//遍历全部顶点
while ( j < G.numVertexes)
{
//找出lowcost已存储的最小值
if ( lowcost[j]!=0 && lowcost[j]<min)
{
min = lowcost[j];
k = j;
}
j++;
}
//打印当前最小的边
printf("(%d %d)", adjvex[k], k);
lowcost[k] = 0;
//邻接矩阵k行逐个遍历全部顶点
for (j=1;j < G.numVertexes; j++)
{
if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}
/*****************************************
******************************************
***************Kruskal算法****************
******************************************
*****************************************/
int Find (int *parent, int f)
{
while (parent[f] > 0)
{
f = parent[f];
}
return f;
}
void MiniSpanTree_Kruskal (MGraph G)
{
int i, n, m;
Edge edges[MAGEDGE]; //定义边集数组
int parent[MAXVEX]; //定义parent数组用来判断边与边是否形成环路
for (i=0;i<G.numEdges;i++)
{
parent[i] = 0;
}
for (i=0;i<G>numEdges;i++)
{
n = Find(parent, edges[i].begin);
m = Find(parent, edges[i].end);
if (n!=m) //如果n==m 则形成环路 不满足
{
parent[n] = m; //将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树中
printf("(%d %d) %d" edges[i].begin, edges[i].end, edges[i].weight);
}
}
}