/********************************************* ****************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); } } }