图论————最小生成树(prim、kruskal)

  生成树属于无向图问题,其结构特点为由 n 个顶点和 n-1 条边组成的无回路的图。

最小生成树的特性
1、最小生成树不一定唯一,权值之和总唯一
2、最小生成树的边数比顶点数少


最小生成树的特例
1、G中各边权值互不相等
2、G本身就是一棵树


Prim算法[ O(n2) ]

  prim算法的操作核心是根据顶点进行构造生成树,为了便于记忆我自己称它为点权法

算法思想:
1、从图中任取一个顶点作为树
2、选择与该树中顶点相连权值最小的边
3、将其边上顶点并入树中
4、repeat,直到图中所有顶点并入树中

void Prim(MGraph g,int v0,int &sum){
	int lowcost[maxSize];
	int vset[maxSize];
	int v;
	int i,j,k,min;
	v = v0;
	for(i = 0; i < g.n ; ++i){
		lowcost[i] = g.edges[v0][i];
		vset[i] = 0;
	}
	vset[v0] = 1;
	sum = 0;
	for(i = 0; i <g.n-1; ++i){
	//筛选最小权值
		for(j = 0; j < g.n; ++j){
			if(vset[j] == 0 && lowcost[j] < min){
				min = lowcost[j];
				k = j;
			}
		}
	}
	//最小权值顶点并入树
	vset[k] = 1;
	v = k;
	sum += min;
	//更新v的候选边
	for(j = 0; j < g.n; ++j)
		if(vset[j] == 0 && g.edges[v][j] < lowcost[j])
			lowcost[j] = g.edges[v][j];
}

Kruskal算法

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