数据结构之最小生成树
2016-07-29 22:05
302 查看
目录
目录最小生成树之Prim
百度解释
算法描述
个人理解
核心代码
最小生成树之Kruskal
百度解释
算法描述
个人理解
核心代码
最小生成树之Prim
百度解释
普里姆算法(Prim算法)图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
算法描述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边
个人理解
Prim最小生成树算法 :Prim算法的目标是构建连通图,是所有边权值之和最小的连通图,也就是最小生成树。
首先选择初始化顶点结合的第一个顶点,以该节点为入口,寻找与该顶点相连的权值最小的边,将该边加入到顶点集合。
寻找与已有顶点集合中顶点相连的权值最小的边,并加入到定点集合(注意算法的目标是为了构造连通图)
重复以上步骤直到结束
核心代码
//图数据存储 public int[][] Arry; //顶点集合 public int[][] V; //已处理的顶点集合 public int[] dest; int index=1; void Prims(int start){ dest[index++]=V[start][0]; V[start][1]=1; int stance=9999; int v=0; int s=0; if(index==V.length) return; for(int i=1;i<dest.length&&dest[i]!=0;i++){ for(int j=1;j<Arry.length;j++){ if(stance>=Arry[dest[i]][j]&&Arry[dest[i]][j]!=0&&V[j][1]==-1){ stance=Arry[dest[i]][j]; v=j; s=dest[i]; } } } System.out.println("---最小权--"+s+"--到--"+v+"权值为"+stance+",index="+index); Prims(v); }
最小生成树之Kruskal
百度解释
Kruskal算法求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,(共n个点)所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。
算法描述
初始化:顶点集V,和边集为空。每个顶点构成一颗树,此时的目标最小生成树为顶点,不含有边对图进行处理,按照图的边的权值进行升序排序。
然后依次选择一条边。如果这条边加入边集后不构成回路,则将边加入边集,反之则抛弃.重复该步骤,直到结束
个人理解
Kruskal算法的目的是为了构造最小生成树,通过将对边权值进行排序和边加入后是否产生回路进行检测,保证了最后的结果是最小生成树。最小生成树的边数=顶点数-1,以此为判断条件,结束算法。核心代码
public void Krustals(){ //首先对权值升序排序 list.sort(new Comparator<Node>(){ @Override public int compare(Node arg0, Node arg1) { return Integer.compare(arg0.GetLength(), arg1.GetLength()); } }); for(Node node : list){ int i=0,j=0; for(i=node.GetStart();arr[i]!=i;i=arr[i]){ arr[i]=arr[arr[i]]; } for(j=node.GetEnd();arr[j]!=j;j=arr[j]){ arr[j]=arr[arr[j]]; } if(edge==nodeCount-1) return; if(i!=j){ edge++; arr[j]=i; System.out.println(node); } } }
对以前算法的复习,也参考了百度百科和网上资料,结合自己的一些理解,有些粗糙,欢迎指点。
相关文章推荐
- 线段树专题#5_蒟蒻训练历程记录_HDU 1394 Minimum Inversion Number_单点更新+思维转换
- python 协程库gevent学习--gevent数据结构及实战(三)
- 数据结构实验之栈五:下一较大值(一)
- 数据结构实验之二叉树二:遍历二叉树
- BZOJ3224普通平衡树
- 数据结构实验之栈二:一般算术表达式转换成后缀式 (sdut oj 2132)
- 数据结构实验之栈二:一般算术表达式转换成后缀式
- sdut oj2134 数据结构实验之栈四:括号匹配
- SDUT 3348 数据结构实验之数组二:稀疏矩阵
- 数据结构之栈进制转换 (sdut oj 1252)
- 数据结构实验之栈二:一般算术表达式转换成后缀式(栈)
- 2119数据结构实验之链表四:有序链表的归并
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- SDUT 3361 数据结构实验之图论四:迷宫探索
- 数据结构实验之二叉树一:树的同构
- 线段树专题#4_蒟蒻训练历程记录_HDU1698_ 延迟标记、区间更新
- HDU 3849 双联通+Trie树+并查集
- 2118数据结构实验之链表三:链表的逆置
- 数据结构实验之栈:行编辑器
- soot基础 -- 相关数据结构SootClass,SootMethod,SootBody,Unit的进一步说明