最小生成树:Prim算法 Kruskal算法 代码实现(C语言)

最小生成树:对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)可能不同,设R为生成树G的所有生成树的集合,若T为R中边的权值之和最小的那颗生成树,则T成为G的最小生成树。

Prim算法:

根据顶点来求最小生成树,时间复杂度为O(V*V),不依赖于(|E|),所以适用于边稠密的图

Kruskal算法:

按权值递增的顺序依次选择合适的边生成最小生成树。复杂度为O(ElogE),适用于边稀疏而顶点稠密的图

代码实现:

#include
#include
#define MaxVexNum 50
#define MaxInt 32767
#define MaxEdgeNum 50
//邻接矩阵
typedef int VertexType;
typedef int EdgeType;
typedef struct AMGraph{
	VertexType vexs[MaxVexNum];//顶点表 
	EdgeType arcs[MaxVexNum][MaxVexNum];//邻接矩阵表 
	int vexnum,edgenum;//顶点数,边数 
}AMGraph; 

void createGraph(AMGraph &g){//创建无向图 
	printf("请输入顶点数:");
	scanf("%d",&g.vexnum);
	printf("\n请输入边数:");
	scanf("%d",&g.edgenum);
	
	//初始化顶点表 
	for(int i=0;i0){
		 		if(MinTree[j].lowcost0&&GetRoot(v,i)!=GetRoot(v,j)){//选出的边不能形成回路 
				min=g.arcs[i][j];
				x=i;
				y=j;

			}
		} 
	}
				printf("[%d %d]\n",x,y); 
				sum+=min;
				g.arcs[x][y]=0;//将这条边置零,以便选出次小边 
				g.arcs[y][x]=0;//无向图 
				v[y]=x;//将两个结点挂在一棵树上
	}
	printf("\n最短路径长度为:%d\n",sum);
} 
int main(){
	AMGraph g;
	createGraph(g);
	//PrintGraph(g);
	Prim(g,0);
	Kruskal(g);
}

代码运行结果图:

最小生成树:Prim算法 Kruskal算法 代码实现(C语言)_第1张图片

你可能感兴趣的:(数据结构)