《数据结构》课程设计--最小生成树问题.doc

上传人:知****量 文档编号:92940213 上传时间:2023-06-16 格式:DOC 页数:55 大小:2.70MB
返回 下载 相关 举报
《数据结构》课程设计--最小生成树问题.doc_第1页
第1页 / 共55页
《数据结构》课程设计--最小生成树问题.doc_第2页
第2页 / 共55页
点击查看更多>>
资源描述

《《数据结构》课程设计--最小生成树问题.doc》由会员分享,可在线阅读,更多相关《《数据结构》课程设计--最小生成树问题.doc(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 数据结构课程设计报告题目: 最小生成树问题 院(系):计算机工程学院 学生姓名: XXX 班级: XXX 学号:XXXXXXXXX 起迄日期: 2015.07.13-2015.07.24 指导教师: XXX XXX 任务书 最小生成树问题问题描述在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。设计要求(1) 通过输入建立一无向网,存储结构可以采用多种;(2) 要求分别采用普里姆算法和克鲁斯卡尔算法实现;(3) 若以图形界面输出可以适当加分。54一、 需求分析1.问题描述: 该程序主要实现最小生成树功能,在给定的中国铁路网中,选择城市,生成最小生成树。此外,改程序实现了城市介绍,

2、指定城市到其它城市的最短距离,指定城市之间的最短距离等图论的基本操作。直观、清晰的为用户提供全国铁路网的最基本情况。该程序最具体的任务是最小生成树的实现,需要用到Prim算法和Kruskal算法实现。输入指定的城市求出最小生成树,方便查询城市间的最短连通量。另外添加了显示全国主要铁路网的功能,在跳出的界面,选择城市,程序会通过textBox控件显示选定的城市的相关介绍。该程序实现了指定城市到其它城市之间的最短距离。通过在地图上选择城市,程序通过Dijkstra算法计算出指定城市到其它城市之间的最短距离,并通过textBox控件显示,一目了然。具有较强的人机和谐性。还可以实现指定城市之间的最短路

3、,输入两个指定的城市,通过Floyd算法求出选定城市间的最短距离。并在图形界面上标注要经过的城市。2.基本功能:(1) 通过输入建立一无向网,存储结构采用了邻接矩阵。(2) 要求分别采用Prim算法和Kruskal算法实现,分别对应Prim.cs和Kruskal.cs。(3) 若以图形界面输出会适当加分。3.附加功能:(1)城市的介绍,在输出的全国铁路网中,点击相应的城市会出现对该城市相应的介绍。主要实现代码在Map.cs中。(2)指定城市到其它城市的最短距离,在地图上点击指定城市,程序会显示指定城市到其它城市的最短距离。主要实现代码在Dijkstra.cs中(3)指定的两个城市之间的最短距离

4、。在地图中选择两个城市,程序会显示这两个城市之间的最短距离,并在地图上显示在这两个城市之间经过的城市。主要实现代码在LeastRoad.cs中。二、 概要设计1.设计思路: 首先,将城市和道路的主要信息,包括城市和道路的数量、城市的名称、道路的相关信息存入文件中。在每个程序模块中通过字节流StreamReader从文件中读取字符,放入程序定义的存储结构中。(1) 城市介绍。地图所含城市的主要介绍和城市名存入文本文件c5.txt中,在Map.cs中定义选定城市的关键字T,读取文件中的内容,寻找关键字T相对应的城市名,并在textBox1中输出该城市的相关内容。(2) 指定城市到其它城市的最短路。

5、从文件c1.txt、c2.txt、c3.txt中分别读取城市即道路的数量、城市名称、道路的相关信息。存于指定的变量中。采用Dijkstra算法求出指定城市到其它城市的最短路,存入指定变量中。Dijkstra算法用于求某个顶点到其余各顶点的最短路径。(3) 指定城市之间的最短路。从文件c1.txt、c2.txt、c3.txt中分别读取城市即道路的数量、城市名称、道路的相关信息。存于指定的变量中。在给定的图中选择两个城市,存入相应的变量中。采用Floyd算法求出指定城市之间的最短路径。Floyd算法用于求每一对顶点之间的最短路径。(4) 最小生成树(Prim)。从文件c1.txt、c2.txt、c

6、3.txt中分别读取城市即道路的数量、城市名称、道路的相关信息,存于指定的变量中。在给定的图中选择城市,存入相应的变量中。采用Prim算法求出最小生成树。Prim算法通过寻找最小的距离,生成最小生成树。(5) 最小生成树(Kruskal)。从文件c1.txt、c2.txt、c3.txt中分别读取城市即道路的数量、城市名称、道路的相关信息,存于指定的变量中。在给定的图中选择城市,存入相应的变量中。采用Kruskal算法求出最小生成树。Kruskal算法通过寻找最小的边的操作,生成最小生成树。2.数据结构设计:逻辑结构:图状该程序主要实现最小生成树、指定顶点间的最短距离。题目的设计要求决定,图的存

7、储结构是最理想的选择。其次,采用图状结构,更加适用于本程序,更形象化。便于整个程序代码的编写。为之后的功能设计提供方便。存储结构:顺序。链式存储结构,具有操作灵活、简便等特点。由于程序采用C#语言设计。在C#中没有指针这一类型。虽然可以通过类的定义实现链式存储,但操作过于麻烦,容易造成隐藏的错误。所以采用顺序存储结构。采用顺序存储结构也可以实现图的存储,进而进行之后的一些列操作。相比于链式,顺序存储结构在一些算法的设计上,所消耗的时间可能会更少。抽象数据类型:抽象数据类型邻接矩阵的定义如下: string city = new stringn; City 数据对象:数据对象:D=AiAicit

8、y,i=1,2,3. .,n,n0 基本操作: Dijkstra.Button1; 初始条件:city数组已定义,并存储了文件中的数据。 操作结果:输出指定城市到其余城市间的最短距离。 Dijkstra.textBox1; 初始条件:city数组已定义,并存储了文件中的数据。 操作结果:将需要显示的city信息显示到textBox1控件中。 LeastRoad.Button3; 初始条件:city数组已定义,并存储了文件中的数据。 操作结果:输出指定两个城市之间的最短距离,在图像中显示指定两城市间经过的城市。 Prim.Button2; 初始条件:city数组已定义,并存储了文件中的数据,i1

9、n。 操作结果:根据选定的城市,输出最小生成树并在图像中显示。 Kruskal.Button2; 初始条件:city数组已定义,并存储了文件中的数据,i1n。 操作结果:根据选定的城市,输出最小生成树并在图像中显示。 int, Railway = new intm, m; Railway 数据对象:D=BiBicity,i=1,2,3. .,n,n0 数据关系:R=Bi-1,BiWay,i=1,2,3. .,n,n0 基本操作: Dijkstra.Button1; 初始条件:Railway数组已定义,并存储了文件中的数据。 操作结果:输出指定城市到其余城市间的最短距离。 LeastRoad.B

10、utton3; 初始条件:Railway数组已定义,并存储了文件中的数据。 操作结果:输出指定两个城市之间的最短距离,在图像中显示指定两城市间经过的城市。 Prim.Button2; 初始条件:Railway数组已定义,并存储了文件中的数据。 操作结果:根据选定的城市,输出最小生成树并在图像中显示。 Kruskal.Button2; 初始条件:Railway数组已定义,并存储了文件中的数据。 操作结果:根据选定的城市,输出最小生成树并在图像中显示。 3.软件结构设计:图2.1软件结构设计 三、 详细设计 1.定义程序中所用到的数据及数据结构 数据: string T; /用于记录查询的程序 s

11、tring T = new string1; /用于存储选中的城市 string city = new stringn; /用户存储城市信息 int, Railway = new intm, m; /用于存储铁路信息 string city1 /用于记录弧头城市 string city2 /用于记录弧尾城市 Control c /用于遍历控件 int con = new intn; /用于标记被访问过的城市 int td = new intn; /用于临时记录城市间的距离 int dist = new intn; /记录指定城市到其它城市的距离 int, tag = new intn, n;

12、/用于给铁路标号 Point P = new Pointn+5; /记录城市的位置信息 int visit = new intn; /标记城市是否被访问过 bool, , path = new booln, n, n; /记录两城市间通过的城市 Pen pen = new Pen(Color.Green, 5); /定义画笔信息 string Target = textBox1.Lines; /记录从textBox1中获取的信息 int Selected = new intn; /记录选定城市的标号 int Pcity = new inti1; /用于存储选中的城市 int Pdistance

13、 = new inti1; /用于存储距离 int, ln = new intn, n; /记录道路信息 int set = new intn; /记录边的弧头、弧尾邻接矩阵:int n; /用于记录城市的数目int m; /用于记录道路的数目 string city = new stringn; /用户存储城市信息 int, Railway = new intm, m; /用于存储铁路信息2.主函数和其他函数的伪码算法:查询城市信息按钮: private void button1_Click(object sender, EventArgs e) textBox1.Clear(); fore

14、ach (Control c in this.Controls) /遍历程序内的控件 if (c is GroupBox) foreach (Control d in c.Controls) /遍历GroupBox1中的所有控件 if (d is RadioButton) if (RadioButton)d).Checked = true) T = (RadioButton)d).Text; /获取指定RadioButton空间的Text属性值 textBox1.Text += T; /在文本控件中显示文本信息 string Target; textBox2.Clear(); /清空textB

15、ox2中的文本信息 StreamReader filestream1 = new StreamReader(D:/c5.txt, Encoding.Default); /从指定文本文件中读取字符 Target = filestream1.ReadLine(); while(Target!=null) /将城市的相关信息写入文本控件textBox2中 int flag2 = 0; if(Target=T) /检测目标文本是否和给定文本相匹配 for (; ; ) Target = filestream1.ReadLine(); if (Target = #) break; else textBo

16、x2.Text += Target; flag2 = 1; if (flag2 = 1) /是否跳出循环 break; Target = filestream1.ReadLine(); filestream1.Close(); /关闭字节流 指定城市到其余城市最短距离按钮: private void button1_Click(object sender, EventArgs e) textBox1.Clear(); /清空textBox1中的原有信息 StreamReader filestream1 = new StreamReader(D:/c1.txt, Encoding.Default

17、); /从c1.txt文件中读取信息 int n = int.Parse(filestream1.ReadLine(); int m = int.Parse(filestream1.ReadLine(); filestream1.Close(); StreamReader filestream2 = new StreamReader(D:/c2.txt, Encoding.Default); /从c2.txt文件中读取信息 string city = new stringn; for (int i = 0; i n; i+) cityi = filestream2.ReadLine(); fi

18、lestream2.Close(); StreamReader filestream3 = new StreamReader(D:/c3.txt, Encoding.Default); /从c3.txt文件中读取信息 int, Railway = new intm, m; int, tag = new intn, n; for (int i = 0; i m; i+) for (int j = 0; j m; j+) Railwayi, j = 10000; for (int i = 0; i n; i+) /用于记录城市的标号 for (int j = 0; j n; j+) tagi, j

19、 = 0; string city1, city2; for (int i = 0; i m; i+) /获取城市间距离信息 city1 = filestream3.ReadLine(); /获取弧头城市的信息 city2 = filestream3.ReadLine(); /获取弧尾城市的信息 int flag = 0; for (int j = 0; j n; j+) for (int k = 0; k n; k+) if (city1 = cityj & city2 = cityk) Railwayj, k = Railwayk, j = Convert.ToInt32(filestre

20、am3.ReadLine(); tagj, k = tagk, j = i; flag = 1; break; if (flag = 1) break; filestream3.Close(); foreach (Control c in this.Controls) /遍历所有的控件,寻找groupBox1 if (c is GroupBox) foreach (Control d in c.Controls) /遍历groupBox1中的控件,寻找RadioButton控件 if (d is RadioButton) if (RadioButton)d).Checked = true) T

21、0 = (RadioButton)d).Text; /记录寻找的RadioButton的Text属性值 int r=new int1; int s = new int1; int con = new intn; int td = new intn; for (int i = 0; i n; i+) /记录寻找的城市的标号 if (cityi = T0) r0 = i; for (int i = 0; i n; i+) /记录城市是否被访问过 coni = 0; int dist = new intn; /记录指定城市到其它城市的距离 for (int i = 0; i n; i+) disti

22、 = 10000; for (int i = 0; i n; i+) /记录指定城市到直接关联城市的距离 if (Railwayr0, i 10000) disti = Railwayr0, i; distr0 = 0; /指定城市到自己的距离为0 conr0 = 1; /标记指定城市已被访问过 for (int i = 1; i n; i+) int mini = 10000; for (int j = 0; j n; j+) /寻找最小距离 if (distj mini & conj = 0) mini = distj; s0 = j; /记录城市的标号 cons0 = 1; /标记城市已

23、被访问过 for (int j1 = 0; j1 n; j1+) /标记指定城市到其它城市的距离 tdj1 = 10000; for (int j2 = 0; j2 n; j2+) if (Railways0, j2 10000) tdj2 = Railways0, j2; for (int j3 = 0; j3 n; j3+) /更新最小距离 if (conj3 = 0 & mini 10000 & tdj3 10000 & mini + tdj3 distj3) distj3 = mini + tdj3; for (int j4 = 0; j4 +cityj4 + : + distj4 +

24、 KM+rn; 指定城市之间最短距离按钮: private void button3_Click(object sender, EventArgs e) Graphics g = this.groupBox1.CreateGraphics(); /在groupBox1中创建Graphics对象 textBox3.Clear(); /清空textBox3中原有的信息 StreamReader filestream1 = new StreamReader(D:/c1.txt, Encoding.Default); /从c1.txt文件中读取信息 int n = int.Parse(filestre

25、am1.ReadLine(); int m = int.Parse(filestream1.ReadLine(); filestream1.Close(); StreamReader filestream2 = new StreamReader(D:/c2.txt, Encoding.Default); /从c2.txt文件中读取信息 string city = new stringn; for (int i = 0; i n; i+) cityi = filestream2.ReadLine(); filestream2.Close(); StreamReader filestream3 =

26、 new StreamReader(D:/c3.txt, Encoding.Default); /从c3.txt文件中读取信息 int, Railway = new intm, m; int, tag = new intn, n; for (int i = 0; i m; i+) for (int j = 0; j m; j+) Railwayi, j = 10000; for (int i = 0; i n; i+) /用于记录城市的标号 for (int j = 0; j n; j+) tagi, j = 0; string city1, city2; for (int i = 0; i

27、m; i+) /获取城市间距离信息 city1 = filestream3.ReadLine(); /获取弧头城市的信息 city2 = filestream3.ReadLine(); /获取弧尾城市的信息 int flag = 0; for (int j = 0; j n; j+) for (int k = 0; k n; k+) if (city1 = cityj & city2 = cityk) Railwayj, k = Railwayk, j = Convert.ToInt32(filestream3.ReadLine(); tagj, k = i; flag = 1; break;

28、 if (flag = 1) break; filestream3.Close(); Point P = new Pointn+5; /定义坐标数组,记录城市的位置信息 int X1, Y1; int z = 0; foreach (Control c in this.Controls) /遍历图中所有的控件,寻找groupBox控件 if (c is GroupBox) foreach (Control d in c.Controls) /遍历groupBox中的控件,寻找RadioButton控件 if (d is RadioButton) X1 = (RadioButton)d).Loc

29、ation.X; Y1 = (RadioButton)d).Location.Y; Pz+ = new Point(X1, Y1); /记录城市的位置信息 int, dist = new intn, n; /记录城市之间的距离 int visit = new intn; /记录城市是否被访问 bool, , path = new booln, n, n; /记录两城市之间通过的城市 for (int x1 = 0; x1 n; x1+) /初始化path数组 for (int y1 = 0; y1 n; y1+) for (int z1 = 0; z1 n; z1+) pathx1, y1, z1 = false; for (int v = 0; v n; v+) /将城市间的距离信息输入到dist数组中 for (int w = 0; w n; w+) distv, w = Railwayv, w; if (Railwayv, w 10000) pathv, w, v = true; pathv, w, w = true; for (int u = 0; u n; u+) /寻找城市间的最短距离 for (int v = 0; v n; v+)

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

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁