2013冬课程设计_破圈法java实现.doc

上传人:人*** 文档编号:543227089 上传时间:2023-02-25 格式:DOC 页数:12 大小:525KB
返回 下载 相关 举报
2013冬课程设计_破圈法java实现.doc_第1页
第1页 / 共12页
2013冬课程设计_破圈法java实现.doc_第2页
第2页 / 共12页
2013冬课程设计_破圈法java实现.doc_第3页
第3页 / 共12页
2013冬课程设计_破圈法java实现.doc_第4页
第4页 / 共12页
2013冬课程设计_破圈法java实现.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《2013冬课程设计_破圈法java实现.doc》由会员分享,可在线阅读,更多相关《2013冬课程设计_破圈法java实现.doc(12页珍藏版)》请在金锄头文库上搜索。

1、 1. NANCHANG UNIVERSITY 课 程 设 计 报 告 课程名称: 程序设计课程设计实验 题 目: 破圈法求生成树 学 院: 信息工程 系: 电子商务 专 业: 计算机科学与技术 班 级: 学 号: 学生姓名: 时 间: 2013-12-30至2014-1-5 指导教师: 目 录1 课程设计目的 12 课程设计问题描述与要求 23 课程设计报告内容 24 结论 105 参考书籍 10摘 要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。本课程设计是以java语言来编写,主要运用了邻接矩

2、阵的存储形式,和实现Collection接口的类来简化程序,实现生成最小生成树。最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆, 构建造价最低的通讯网络 。关键词:java,最小生成树;破圈法1. 课程设计目的求解最小生成树是数据结构课程教学中的一个重点学习的图论问题。但是目前教材中普遍讲解的是Prim和Kruskal算法,这两个算法的基本思想是基于避圈论法,破圈法而从相反的角度求解最小生成树。通过本次课程设计可以使学生了解破圈法求解最小生成树的基本理论,深化对破圈法算法方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念。2. 课

3、程设计题目描述和要求2.1题目描述 利用破圈法求最小生成树,并且运用面向对象的程序设计语言实现该算法。2.1.1最小生成树 在一给定的无向图G = (V, E)中,(u, v) 代表连接顶点u 与顶点v的边(即),而w(u, v)代表此边的权重,若存在T为E的子集(即)且为无循环图,使得的w(T)最小,则此T为G的最小生成树。2.1.2破圈法实现的理论依据 该算法的理论依据是存在性定理:连通图至少有一棵生成树。如果我们给的连通图G 中没有回路,那么G 本身就是一棵生成树,若G 中只有一个回路,则删去G 的回路上的一条边(不删除结点),则产生的图仍是连通的,且没有回路,则得到的子图就是图G 的一

4、棵生成树,若G 的回路不止一个,只要删去每一个回路上的一条边,直到G 的子图是连通没有回路且与图G 有一样的结点集,那么这个子图就是一棵生成树。由于我们破坏回路的方法可以不一样(即删去的边不一样)所以可得到不同的生成树,但是在求最小生成树的时候,为了保证求得的生成树的树权W(T)最小,那么在删去回路上的边的时候,总是在保证图仍连通的前提下删去权值较大的边,尽量保留权值较小的边。这就是所谓的破圈法。2.1.3破圈法算法步骤 1. 在给定的赋权的连通图上任意找一个圈。 2. 在所找的圈中去掉一条权数最大的边(若有两条或者两条以上权数相等的 边,则任意去掉其中一条)。 3. 重复1、2操作,直至余下

5、的图为最小生成树。如图:3. 课程设计报告内容3.1概要设计程序的UML图:3.2算法的基本过程3.2.1算法中的主要的主程序:(一) createEdgeList()用于通过邻近矩阵创建边集数组,为了方便排序,所以返回一个为ArrayList类型的引用。(二) removeEdge()用于删除某一条边。(三) IsConnectedGraph()检查图是否为连通图,可用于输入检查,和破圈法中检验在删除某条边后,所剩下图是否为连通图。(四) breakLoopBST()破圈法算法:首先用createEdgeList()方法由邻近矩阵产生图的边集列表,利用Collections的sort()和r

6、everse()方法使边列表以降序排列,依次删除列表中的最大边,并且同时检验删除后所剩下的图是否为连通图,如果是则可以删除,若不是重新把删除的边恢复,直到只剩下V-1条边(V为顶点数)。3.2.2主程序main()的基本流程(一) 创建图对象,自动调用构造方法初始化,输入邻接矩阵(二) 调用破圈法方法breakLoopBST(),生成最小生成树(三) 调用output()输出最小生成树的邻接矩阵(四) 程序结束3.3算法实现的源程序(java)EdgeElement.java:public class EdgeElement implements Comparable/边元素int fromv

7、ex;int endvex;int weight;/边的两个点与权重public EdgeElement(int v1, int v2,int wgt)/边集元素的构造方法fromvex = v1;endvex = v2;weight = wgt;public int getFromvex()/获取边元素的点和权重数据return fromvex;public int getEndvex()return endvex;public int getWeight()return weight;Overridepublic int compareTo(EdgeElement e)/覆盖compara

8、To方法return weight e.weight?1:(weight e.weight?-1:0);Overridepublic String toString()/覆盖toString方法return (+fromvex+,+endvex+)+weight;Graph.java:import java.util.*;public interface Graph /图的接口,包含图的操作void intialGraph();public boolean IsConnectedGraph();/检查是否为连通图public void createGraph(EdgeElement d);/根

9、据边集组创建一个图public ListcreateEdgeList();/由邻接矩阵生成边集列表int vertices();/返回图的定点数int edges();/返回图的边数void putEdge(EdgeElement e);/填点边void removeEdge(int i,int j);/删除边boolean findEdge(int i ,int j);/查找边void output();/输出图public List depthFirstSearch(int v);/深度优先遍历void breakLoopBST();/破圈法求最小生成树AdjacencyGraphy.ja

10、va:import java.util.*;public class AdjacencyGraphy implements Graph final int MaxValue = 1000;/一个不存在的边的权值int n;/顶点数int e;/边数int a;/邻接矩阵public AdjacencyGraphy(int n)/初始化this.n = n;e = 0;a = new intnn;for(int i = 0 ;i n ; i +)for(int j = 0 ; j n ; j +)if(i=j)aij=0;elseaij=MaxValue;public int getMaxVal

11、ue()return MaxValue; public AdjacencyGraphy()intialGraph();/*实现接口中的方法*/public void intialGraph()System.out.print(请输入图的顶点数:);Scanner s = new Scanner(System.in);n=s.nextInt();a = new intnn;System.out.println(请输入图邻接矩阵(无边的权值为1000):);for(int i = 0 ;i n ; i +)for(int j = 0 ; j n ; j +)aij = s.nextInt();s.

12、close();public boolean IsConnectedGraph()/检查是否为连通图HashSet set1 = new HashSet();for(int i = 0; i n; i+)set1.add(i);int m = (int)Math.random()*n;HashSet set2 = new HashSet(depthFirstSearch(m);if(!set1.equals(set2)return false;else return true;public void createGraph(EdgeElement d)/根据边集组创建一个图for(int t = 0;t d.length; t+)putEdge(dt);public ListcreateEdgeList()/由邻接矩阵生成边集列表ArrayList l = new ArrayList();for(int i = 0 ;i n ; i +

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号