最小生成树之Prim算法.doc_第1页
最小生成树之Prim算法.doc_第2页
最小生成树之Prim算法.doc_第3页
最小生成树之Prim算法.doc_第4页
最小生成树之Prim算法.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最小生成树之Prim算法1、生成树的概念 连通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之变成非连通图。 生成树各边的权值总和称为生成树的权。权最小的生成树称为最小生成树。2、最小生成树的性质 用哲学的观点来说,每个事物都有自己特有的性质,那么图的最小生成树也是不例外的。按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。3、构造最小生成树,要解决以下两个问题:( 1).尽可能选取权值小的边,但不能构成回路(也就是环)。(2).选取n-1条恰当的边以连接网的 n个顶点。求最小生成树的算法一般都使用贪心策略,有Prim算法和Krusal算法等。普里姆算法的基本思想:1)清空生成树,任取一个顶点加入生成树;2)在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树;3)重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树。即:从连通网络 N = V, E 中的某一顶点 u0 出发,选择与它关联的具有最小权值的边(u0, v),将其顶点v加入到生成树的顶点集合U中。以后每一步从一个顶点在U中,而另一个顶点不在U中的各条边中选择权值最小的边(u, v),把它的顶点 v加入到集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。编写程序:对于如下一个带权无向图,给出节点个数以及所有边权值,用Prim算法求最小生成树。代码的注释我写得很详细,方便理解,有几点需要说明一下。(1)、2个for循环都是从2开始的,因为一般我们默认开始就把第一个节点加入生成树,因此之后不需要再次寻找它。( 2)、lowcosti记录的是以节点i为终点的最小边权值。初始化时因为默认把第一个节点加入生成树,因此lowcosti = graph1i,即最小边权值就是各节点到1号节点的边权值中最小的。( 3)、msti记录的是lowcosti对应的起点,这样有起点,有终点,即可唯一确定一条边了。初始化时msti = 1,即每条边都是从1号节点出发。输入数据:7 11A B 7A D 5B C 8B D 9B E 7C E 5D E 15D F 6E F 8E G 9F G 11输出:A - D : 5D - F : 6A - B : 7B - E : 7E - C : 5E - G : 9Total:39最小生成树Prim算法朴素版 java语言实现 代码如下import java.util.*;public class Main static int MAXCOST=Integer.MAX_VALUE; static int Prim(int graph, int n) /* lowcosti记录以i为终点的边的最小权值,当lowcosti=0时表示终点i加入生成树 */ int lowcost=new intn+1; /* msti记录对应lowcosti的起点,当msti=0时表示起点i加入生成树 */ int mst=new intn+1; int min, minid, sum = 0; /* 默认选择1号节点加入生成树,从2号节点开始初始化 */ for (int i = 2; i = n; i+)/* 最短距离初始化为其他节点到1号节点的距离 */lowcosti = graph1i; /* 标记所有节点的起点皆为默认的1号节点 */msti = 1; /* 标记1号节点加入生成树 */ mst1 = 0; /* n个节点至少需要n-1条边构成最小生成树 */ for (int i = 2; i = n; i+)min = MAXCOST;minid = 0; /* 找满足条件的最小权值边的节点minid */ for (int j = 2; j = n; j+) /* 边权值较小且不在生成树中 */ if (lowcostj min & lowcostj != 0) min = lowcostj; minid = j; /* 输出生成树边的信息:起点,终点,权值 */System.out.printf(%c - %c : %dn, mstminid + A - 1, minid + A - 1, min); /* 累加权值 */ sum += min; /* 标记节点minid加入生成树 */ lowcostminid = 0; /* 更新当前节点minid到其他节点的权值 */ for (int j = 2; j = n; j+) /* 发现更小的权值 */ if (graphminidj lowcostj) /* 更新权值信息 */ lowcostj = graphminidj; /* 更新最小权值边的起点 */ mstj = minid; /* 返回最小权值和 */return sum; public static void main(String args) Scanner sc=new Scanner(System.in); int cost; char chx, chy; /* 读取节点和边的数目 */ int n=sc.nextInt();/节点 int m=sc.nextInt();/边数 int graph=new intn+1n+1; /* 初始化图,所有节点间距离为无穷大 */ for (int i = 1; i = n; i+)for (int j = 1; j = n; j+)graphij = MAXCOST; /* 读取边信息 */ for (int k = 0; k m; k+) chx=sc.next().charAt(0); chy=sc.next().charAt(0); cost=sc.nextInt(); int i = chx - A + 1; int j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论