`
u010815305
  • 浏览: 30198 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

图的最小生成树求法汇总

 
阅读更多
普里姆算法
从连通图N=(U,E)中招最小生成树T=(U,TE).
1.算法思想
<1>若从顶点v0出发构造,U={v0},TE={};
<2>先找权值最小的边(u,v),其中u∈U且v∈V-U,并且子图不构成环,则
U=U∪{v},TE=TE∪{(u,v)};

<3>重复(2),直到U=V为止.则TE中必有n-1条边,T=(U,TE)就是最小生成树


2.
设用邻接 矩阵 ((二维数组))表示图,两个顶点之间不存在边的权值为机内允许的最大值。
为便于算法实现,设置一个一 维数组
closedge[n],用来保存,V-U中各顶点到U中顶点具有权值最小的边。数组元素的类型定义是
struct 
{
	int adjvex;/*边所依附于U中的顶点*/
	int lowcost;/*该边的权值*/
}closedge[MAX_EDGE];

在Prime算法中,图采用邻接矩阵存储,所构造的最小生成树用一维数组存储其n-1条边,
每条边的存储结构描述:
typedef struct MSTEdge
{
	int vex1,vex2;/*边所依附的图的两个顶点*/
	WeightType weight;/*边的权值*/
	
}MSTEdge;

算法实现
#define INFINITY MAX_VAL
MSTEdge *Prim_MST(AdjGraph *G,int u)
{
	MSTEdge TE[];
	int j,k,v,min;
	for(j=0;j<G->vexnum;j++)
	{
		closedge[j].adjvex=u;
		closedge[j].lowcost=G->adj[j][u];
	}/*初始化数组closedge[n]*/
	
	closedge[u].lowcost=0;
	TE=(MSTEdge*)malloc((G->vexnum-1)*sizeof(MSTEdge));
	
	for(j=0;j<G->vexnum;j++)
	{
		min=INFINITY;
		for(v=0;v<G->vexnum;v++)
		 if(closedge[v].lowcost!=0&&closedge[v].lowcost<min)
		 {min=closedge[v].lowcost;k=v;}
		TE[j].vex1=closedge[k].adjvex;
		TE[j].vex2=k;
		TE[j].weight=closedge[k].lowcost;
		closedge[k].lowcost=0;/*将顶点k并入U*/
		for(v=0;v<G->vexnum;v++)
		 if(G->adj[v][k]<closedge[v].lowcost)
		 {
			closedge[v].lowcost=G->adj[v][k];
			closedge[v].adjvex=k;
		 }/*修改数组closedge[n]的各个元素的值*
		 /
	}
	return (TE);
}/*求最小生成树的Prim算法*/

克鲁斯卡尔(Kruskal)算法
1 算法思想
设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是其最小生成树。初值:U=V,,TE={} 。
对G中的边按权值大小从小到大依次选取。
<1>选取权值最小的边(vi,vj),若边(vi,vj)加入到TE后形成回路,则舍弃该边(vi,vj) ;
否则,将该边并入到TE中,,即TE=TE∪{(vi,vj)} 。

<2>重<1>,直到TETE中包含有n-1条边为止。


2 算法实现说明
Kruskal 算法实现的关键是:当一条边加入到TE的集合后,如何判断是否构成回路??
简单的解决方法是:定义一个一维数组Vset[n] ,存放图T中每个顶点所在的连通分量的编号。
◆初值:Vset[i]=i,表示每个顶点各自组成一个,连通分量,连通分量的编号简单地使用顶点在图中的位置((编号))。
◆当往T中增加一条边(vi,vj) 时,先检查Vset[i]和Vset[j]值:
☆若Vset[i]=Vset[j]:表明 :vi和vj处在同一个连通分量中,,加入此边会形成回路
☆ 若Vset[i]≠Vset[j],则 加入此边不会形成
回路 ,将此边加入到生成树的边集中。
◆ 加入一条新边后,将两个不同的连通分量合并
将一个 连通分量的编号换成另 一个 连通分量的编
号。
算法实现
MSTEdge *Kruskal(ELGraph *G)
{
	MSTEdge TE[];
	int j,k,s1,s2,Vset[];
	WeightType w;
	Vset=(int*)malloc(G->vexnum*sizeof(int));
	for(j=0;j<G->vexnum;j++)
		Vset[j]=j;/*初始化数组Vset[n]*/
	sort(G->edgelist);/*对表按权值从小到大排序*/
	j=0;k=0;
	while(k<G->vexnum-1&&j<G->edgenum)
	{
		s1=Vset[G->edgelist[j].vex1];
		s2=Vset[G->edgelist[j].vex2];
		/*若边的两个顶点的连通分量编号不同,边加入到TE中*/
		if(s1!=s2)
		{
			TE[k].vex1=G->edgelist[j].vex1;
			TE[k].vex2=G->edgelist[j].vex2;
			TE[k].weight=G->edgelist[j].weight;
			k++;
			for(v=0;v<G->vexnum;v++)
				if(Vset[v]==s2)Vset[v]=s1;
				
		}
		j++;
	}
		free(Vset);
		return (TE);
}


分享到:
评论

相关推荐

    分布式最小生成树聚类的设计与实现.pdf

    在分布式环境下,每个节点可以独立地对一部分数据执行相似度计算和最小生成树的构建,最后将结果汇总,以形成全局的最小生成树。 由于数据挖掘在电信领域的应用日益广泛,聚类算法能够帮助电信运营商从海量的用户...

    图的应用(最小生成树、拓扑排序、关键路径、最短路径)汇总.docx

    1. **最小生成树**:最小生成树是无向连通图的一种特殊树形结构,它由图中的边构成,使得树中所有边的权值之和最小。最小生成树的构建对于资源优化分配和网络建设有着实际意义。例如,在建设通信网络时,我们需要在...

    数据结构几大类算法综合汇总

    在这个综合汇总中,我们将深入探讨六个关键领域的算法:最小生成树、一元多项式、复数四则运算、哈夫曼树、内部排序以及二叉树的深度和叶子节点个数。 首先,让我们来看一下最小生成树算法。在图论中,给定一个加权...

    poj图论题目汇总

    - **知识点**:最小生成树(MST),一种用于构造连接图中所有顶点且总权重最小的树的算法,如Prim算法或Kruskal算法。 #### 1273 Drainage Ditches - 最大流 - **知识点**:最大流算法,用于解决图中源点到汇点的...

    中国科学技术大学软件学院考研复试问题汇总

    最小生成树是一个连通图的极小连通子图,且包含原图中的所有结点,并且有保持图连通的最少的边。可以用 Kruskal 算法或 Prim 算法求出最小生成树。如果在一棵生成树上添加一条边,必定构成一个环。 2. 二叉排序树和...

    acm 题目汇总(好东西)

    Prim算法和Kruskal算法是解决最小生成树问题的常用方法。例如,POJ 1639 "Picnic Planning" 提出顶点度数有限制的情况,可以使用贪心策略结合Prim或Kruskal。POJ 2728 "Desert King" 要求最优比率生成树,可能需要...

    中项计算公式汇总.pdf

    1.最小生成树: 15 2.最大流量: 17 3.决策论 20 4.灵敏度分析 22 5.线性规划 23 6.动态规划 24 7.牛吃草问题(追及问题): 24 其他公式: 26 1.沟通渠道计算公式: 26 2.香农用概率来定量描述...

    各种算法汇总(背包问题、图论算法)

    本文将详细讨论一些基本的算法,包括数论算法、图论算法,并重点介绍背包问题和最小生成树的相关算法。 首先,让我们关注数论算法。求最大公约数(GCD)和最小公倍数(LCM)是基础数学操作,对于程序设计至关重要。...

    电子科大图论复习资料 包含所有PPT 复习重点 历年真题及答案

    8. **最小生成树**:Prim算法和Kruskal算法用于寻找加权无向图中的最小生成树,即连接所有顶点的树,使得所有边的总权重最小。 9. **匹配问题**:匈牙利算法和Kuhn-Munkres算法解决图的匹配问题,例如分配问题,如...

    poj pku图论、网络流入门题总结、汇总

    - **问题描述:** 验证给定图的最小生成树是否唯一。 - **解题思路:** 可以先通过Prim或Kruskal算法找到最小生成树,然后通过改变权重值的方法来判断最小生成树是否唯一。 - **注意事项:** 判断最小生成树是否唯一...

    Matlab和 AMPL 中战略资产分配问题 的场景树生成算法_代码_下载

    在这个场景中,"Matlab和AMPL中战略资产分配问题的场景树生成算法"是一个用于解决此类问题的工具,它结合了数学优化软件AMPL与强大的数值计算环境Matlab。本文将深入探讨这两个工具在场景树生成算法中的应用,以及...

    数据结构各算法汇总 数据结构各算法汇总

    贪心算法则是在每一步都采取局部最优解,以期望得到全局最优解,例如霍夫曼编码和Prim最小生成树算法。 七、图论与网络流 图论在解决实际问题中起到重要作用,如最小生成树问题、旅行商问题和网络流问题。网络流...

    郑大《数据结构》网考答案汇总.docx

    题目要求使用Kruskal算法构造无向带权图的最小生成树。 这些知识点涵盖了数据结构中的基本概念,如树、图、排序、链表、栈、散列和排序算法,这些都是理解和解决问题的关键工具。学习和掌握这些知识对于计算机科学...

    图论知识点汇总

    - 求最小生成树:Prim算法、Kruskal算法。 - 拓扑排序:在有向无环图(DAG)中,确定顶点的顺序,使得对于每一条有向边(u, v),u的排序总在v之前。 7. **图的特殊类型** - 弦图(Chordal Graph):每个长度大于3的...

    电子学会 青少年软件编程(C语言)等级考试八级 训练题汇总.pdf

    + 图论之最小生成树 + 图论之连通性问题 * 算法之数论 + 算法之排序和算法性能 + 算法之图论 * 基本算法之算法效率 * 编程基础之简单排序 * 数学基础(提高篇) 从部分内容中,我们可以看到这个文件涵盖了广泛...

    acm竞赛贪心算法总结

    1. 最小生成树问题:如Prim算法和Kruskal算法,它们在构建图的最小生成树时,每次添加一条边,这条边使得生成树的总权重增加最少。 2. 包装问题:如背包问题,贪心策略可能是每次选取价值密度最高的物品放入背包。 3...

Global site tag (gtag.js) - Google Analytics