一、把原始图的N个节点看成N个独立子图;
二、每次选取当前最短的边(前提操作是?),看两端是否属于不同的子图;若是,加入;否则,放弃;
三、循环操作该步骤二,直到有N-1条边;
再次算法中要用到并查集对各个节点进行判断;
对并查集不理解的可以参看此ppt
如果对下文看不太懂可以参看这篇文章
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100
#define MAXEDGE 100
typedef struct //图的边集数组表示形式
{
int begin;
int end;
int weight;
}Edge;
/* 交换权值 以及头和尾 */
void Swapn(Edge *edges,int i, int j)
{
int temp;
temp = edges[i].begin;
edges[i].begin = edges[j].begin;
edges[j].begin = temp;
temp = edges[i].end;
edges[i].end = edges[j].end;
edges[j].end = temp;
temp = edges[i].weight;
edges[i].weight = edges[j].weight;
edges[j].weight = temp;
}
/* 对权值进行排序 */
void sort(Edge edges[],MGraph *G)
{
int i, j;
for ( i = 0; i < G->numEdges; i++)
{
for ( j = i + 1; j < G->numEdges; j++)
{
if (edges[i].weight > edges[j].weight)
{
Swapn(edges, i, j);
}
}
}
printf("权排序之后的为:\n");
for (i = 0; i < G->numEdges; i++)
{
printf("(%d, %d) %d\n", edges[i].begin, edges[i].end, edges[i].weight);
}
}
int FindParent(int *parent,int f) //找到点f所在集合的根节点
{
if(f!=parent[f])
return parent[x]=FindParent(parent[f]);
return x;
}
int k; //总共有k个顶点
void MiniSpan_Kruskal(MGraph G)
{
int i,n,m;
Edge edges[MAXEDGE];
int parent[MAXVEX];
for(i=0;i<m;i++)
{
parent[i]=i; //初始化,使各个节点属于不同的集合
}
for(i=0;i<k;i++)
{
n=FindParent(parent,edge[i].begin)
m=FindParent(parent,edge[i].end)
if(m!=n) //根节点不同,所以即m和n不属于一个集合
{
parent[n]=m; //将两个集合进行合并
}
printf("(%d%d)%d",edges[i].begin,edges[i].end,edges[i].weight);
}
}