离散数学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
离散数学实验报告(实验ABC)
|
<
专业班级
学生姓名
{
学生学号
指导老师
完成时间
目录
第一章实验概述 (2)
实验目的 (2)
实验内容 (2)
实验环境 (2)
第二章实验原理和实现过程 (3)
实验原理 (3)
建立图的邻接矩阵,判断图是否连通 (3)
计算任意两个结点间的距离 (3)
对不连通的图输出其各个连通支 (4)
实验过程(算法描述) (4)
程序整体思路 (4)
具体算法流程 (4)
第三章实验数据及结果分析 (6)
建立图的邻接矩阵并判断图是否连通的功能测试及结果分析 (6)
输入无向图的边 (6)
建立图的连接矩阵 (7)
其他功能的功能测试和结果分析 (8)
计算节点间的距离 (8)
判断图的连通性 (8)
输出图的连通支 (9)
退出系统 (9)
第四章实验收获和心得体会 (10)
实验收获 (10)
心得体会 (11)
第五章实验源程序清单 (12)
程序代码 (12)
第一章实验概述
实验目的
理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。
通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,培养逻辑思维;通过实验提高学生编写实验报告、总结实验结果的能力,提高理论联系实际的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。
实验内容
以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A),并计算任意两个结点间的距离(B),对不连通的图输出其各个连通支(C)。
注意:题目类型分为A,B,C三类,其中A为基本题,完成A类题目可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越高。
基本要求如下:程序需具有基本的容错控制,在输入错误时有处理手段;程序界面友好,需要输入的地方有输入说明,说明输入的内容和格式要求等;实验原理和实现过程应该详细分析问题,给出解决思路,描述算法思想,不能用源程序代替算法;测试数据应全面,包括非法输入的处理结果等都应包含在内。
实验环境
C或C++语言编程环境实现。
第二章实验原理和实现过程
实验原理
建立图的邻接矩阵,判断图是否连通
根据图的矩阵表示法建立邻接矩阵A,并利用矩阵的乘法和加法求出可达矩阵,从而判断图的连通性。
连通图的定义:在一个无向图G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的。如果G 是有向图,那么连接vi和vj的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。
判断连通图的实现:在图中,从任意点出发在剩余的点中,找到所有相邻点循环,直到没有点可以加入为止,如果有剩余的点就是不连通的,否则就是连通的。或者也可用WallShell算法,由图的邻接矩阵判断图是否连通。
计算任意两个结点间的距离
图中两点i,j间的距离通过检验A l中使得a ij为1的最小的l值求出。
路径P中所含边的条数称为路径P的长度。在图G
设图的邻接矩阵是A,则所对应的aij的值表示,点Vi到点Vj距离为n的路径有aij条。
若aij(1),aij(2),…,aij(n-1),中至少有一个不为0,则可断定Vi与Vj可达,使aij(l)≠0的最小的l即为d(Vi,Vj)。
问题求解原理为:
(1)先构造初始邻接矩阵A=Vij,Vij为顶点Vi到顶点Vj的权。如果Vi和Vj之间不存在弧段或者是负向回路或者是i=j,则令Vij其值为∞。
(2)再构造初始中间顶点矩阵。
(3)然后开始迭代计算(迭代的次数等于顶点的个数1)
(4)最后查找Vi到Vj的最短路径。
计算节点Vi与Vj之间的距离的方法为:
利用邻接矩阵相互间相乘后得到的矩阵来判断节点间的距离。如果
c2[s][i][j]==0,则这两个节点的距离为无穷大。如果c2[s-2][i][j]==0,c2[s-1][i][j]==1时,则这两点间的距离为s。
对不连通的图输出其各个连通支
图的连通支的求法则可采用图的遍历算法,图的遍历有深度优先和广度优先两种方法,其中深度优先算法又分为递归和非递归两种。
在无向图中,如果任何两点可达,则称图G是连通的,如果G的子图G’是连通的,没有包含G’的更大的子图G’’是连通的,则称G’是G的连通支。
当有判断出关系不是连通的之后,将需要求出分支模块
实现方法如下:先定义一个二维数组用来存放相应的分块,先选定一个点,并将它放在数组中,然后判断,如果后面的和他是联通的便将它也放在同一个数组中,否则将其存入其他的数组中,后面以此类推,在输出相应的数组,便可判断出连通分支。
实验过程(算法描述)
程序整体思路
本程序完成了实验所要求的全部功能,其基本思路是——“运用模块化的思想,将实现“求连通支”、“输入结点关系”、“输出邻接矩阵”、“显示两结点间的距离”、“求可达矩阵”和“图的遍历”的子函数分开编写,然后将它们以子函数的形式添加到主函数main的代码后面,在要使用相应的子函数时,进行子函数调用就可以实现相应的功能了。”
本程序的一大特色就是开发者灵活使用了C语言中的数组概念来进行开发,用数组来模拟矩阵的运算,通过相应的算法实现了全部的功能。
具体算法流程
在main(){系统界面显示;用do…while循环语句和switch语句实现功能
1,2,3……的选择,并调用相关的子程序;用start、goto start实现控制流的转移;} liantongzhi(){求连通支,此子函数通过一个for循环控制遍历每个结点,并调用函数DFS()求每个结点的连通支;}