




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计实习报告 题 目:图的基本操作学 号:1210522姓 名:何厚华年 级:大二学 院:计算机与控制工程学院专 业:计算机科学与技术完成日期:2014年5月21日授课教师:辛运帏目录1.题目. 22.要求 . . . . . . . . . . . . . . . . . . . . . . . . 23.程序实现 . . . . . . . . . . . . . . . . . . . . . 3 3.1程序运行及编译环境 . . . . . . . . . . . . . . . . 3 3.2程序描述 . . . . . . . . . . . . . . . . . 3 3.3实现功能 . . . . . . . . . . . . . . . . . . 3 3.3.1子功能模块 . . . . . . . . . . . . . . . . . 4 3.3.1.1 子功能模块1 . . . . . . . . . . . . . . . 4 3.3.1.2子功能模块2. . . . . . . . . . . . . . . 5 3.3.1.3子功能模块3. . . . . . . . . . . . . . . 5 3.3.1.4子功能模块4. . . . . . . . . . . . . . 5 3.3.1.5子功能模块5. . . . . . . . . . . . . . . 5 3.3.2 数据结构. . . . . . . . . . . . . . . . . . . . 6 3.3.2.1 数据结构的操作1 . . . . . . . . . . . . . 7 3.3.2.2 数据结构的操作2 . . . . . . . . . . . . . 7 3.3.2.3 数据结构的操作3 . . . . . . . . . . . 8 3.3.3算法及程序说明. . . . . . . . . . . . . . . . . . 13 3.4运行结果 . . . . . . . . . . . . . . . . . . . 14 3.5尚未解决的问题 . . . . . . . . . . . . . . . . . . 161. 题目 图的基本操作给定N个顶点、E条边的图G,完成图的相关算法,具体要求如下:1 完成图的创建方法,即从键盘或文件输入图的信息,建立图的邻接表或是邻接矩阵存储结构。2 给出判定图的性质的算法,即能够判定图是否是有向图、无向图、有向无环图、连通图、哈密尔顿图等。3 根据输入的图的性质,实现以下算法(选择其中一两个):l 如果图是有向无环图,则先实现图的某种遍历算法,在此基础上实现图的拓扑排序算法。l 如果图是连通图,则求出图的最大生成树(不是最小生成树,参考讲授的方法),即得到的生成树权值之和最大。l 如果图是无向图,则以第一个顶点当做源点,求出单源最短路径。l 对于哈密尔顿图,找出其哈密尔顿回路。2.要求:初始输入数据的格式由自己定义,例如,输入文件中保存的初始数据格式有以下两种:格式一3 3 2 15 解释:第一行是图中所含顶点个数m,后面是m行m列数据,对应邻接矩阵。格式二3 41 2 31 3 22 3 13 1 5解释:第一行是图中所含顶点个数m和边数e,后面是e条边的信息,如1 2 3表示顶点1到顶点2有权值为3的边。3. 程序实现 3.1程序运行及编译环境程序是用Visual Studio 2010即VS10.0 编译的。可以在windows系列的操作系统上运行。 3.2程序描述 该程序主要用于实现图的基本操作,包括:建立邻接矩阵存储结构,给出判定图的性质的算法,即能够判定图是否是有向图、无向图、有向无环图、连通图、哈密尔顿图等,然后在此基础上,如果图是连通图,则求出图的最大生成树,如果图是无向图,则以第一个顶点当做源点,求出单源最短路径。其流程如下: A).程序读取输入文件,并生成相应的数据结构a. 用二维数组来声明并存储图,完成初始化的工作b.建立图的邻接矩阵存储c.生成图的一步可达矩阵B).输出相关信息 a.判断图是否是有向图 b.判断图是否是无向图 c.判断图是否是连通图 d.判断图是否是有向无环图 e.判断图是否是哈密顿图C).编码以及译码a.如果图是连通图,则求出图的最大生成树。b.如果图是无向图,则以第一个顶点当做源点,求出单源最短路径。D).完成3.3实现功能建立邻接矩阵存储结构,给出判定图的性质的算法,即能够判定图是否是有向图、无向图、有向无环图、连通图、哈密尔顿图等,然后在此基础上,如果图是连通图,则求出图的最大生成树,如果图是无向图,则以第一个顶点当做源点,求出单源最短路径。3.3.1 子功能模块 子功能按照是否对象的方法分类:数组的处理以及树的处理;3.3.1.1 子功能模块1/*函数原型:int Pow(int x,int base=10);*函数参数:x 表示指数*函数功能:求base的幂次*/int Pow(int x,int base=10)if(x=0) return 1;return base*Pow(x-1);3.3.1.2子功能模块2/*函数原型:float Convert2Num(char* str)*函数参数:str 是文件流中的字符串*函数功能:把一个数字字符串转化为一个数字*/float Convert2Num(char* str)float num=0;int i=0,dot=0;if(*str)=I)return INF;while(*(str+i)if(dot!=0) dot+;if(*(str+i)!=.)num=10*num+*(str+i)-0;else dot=1;i+;return dot=0?num:num/Pow(dot-1);3.3.1.3子功能模块3函数功能:Mul矩阵平方放到result矩阵中Void SquareMatrix (int MulMAXNODESMAXNODES,int resultMAXNODESMAXNODES,int n) for(int k=0;kn;k+) for(int l=0;ln;l+) resultkl=0; for(int m=0;mn;m+) if(Mulkm*Mulml!=0) resultkl=1; break; 3.3.2 数据结构/*图这个数据结构的定义,从文件读入,用邻接矩阵存储NodesCount表示结点个数, AdjMatrixMAXNODESMAXNODES是邻接矩阵 ConnectMAXNODESMAXNODES表示一步可达矩阵,其中点到自身为可达*/class Graphint NodesCount;float AdjMatrixMAXNODESMAXNODES;int ConnectMAXNODESMAXNODES;public:Graph(ifstream &fin);/从文件读入图的元素,建立邻接矩阵bool IsUnDirectedGraph();/判断是否是无向图bool IsDirectedGraph();/判断是否是有向图bool IsDirectWithoutLoop();/判断是否是有向无环图bool IsConnected();/判断是否是连通图void Prim(int v);/从节点v开始,用类似prim算法的方法生成最大生成树void floyd();/用floyd算法求任意两个点之间的最短距离int GetNodesCount();/;3.3.2.1 数据结构的操作1/*函数原型:Graph:Graph(ifstream &fin)*函数参数:fin 存放图的文件*函数功能:构造函数,把一个图从文件读入*/Graph:Graph(ifstream &fin)char a MAXLENGTH;. NodesCount=0;while(!fin.eof()i=0;while(fin.get(ch). if(!NodesCount)/NodesCount有数即不再读入 NodesCount=Convert2Num(a); else num=Convert2Num(a); AdjMatrixidx/NodesCountidx%NodesCount=num;/邻接矩阵 Connectidx/NodesCountidx%NodesCount=(num=INF&(idx/NodesCount!=idx%NodesCount)?0:1);/一步可达矩阵 idx+; 3.3.2.2 数据结构的操作2/*函数原型:bool Graph:IsUnDirectedGraph()*函数参数:判断图是否是无向图*实现方法:判断邻接矩阵是否是对称的,如对称,则无向*/bool Graph:IsUnDirectedGraph() for(int k=0;k NodesCount-1;k+) for(int l=k+1;lNodesCount;l+) if(AdjMatrixkl!=AdjMatrixlk) return false; return true;3.3.2.3 数据结构的操作3/*函数原型:bool Graph:IsConnected()*实现方法:将一步可达矩阵依次平方,直到该乘积收敛得到的* 就是这个图的可达矩阵,这个算法复杂度是o(n2lgn)由于一步可达矩阵的对角线的元素全为1,而且矩阵的乘法是逻辑乘,所以,这个矩阵原来的某个位置如果为1,那么一直为1,最后一定会收敛,这里是将这个矩阵平方后再平方,加快收敛速度,从而快速判断这个图是否是连通的*/bool Graph:IsConnected()int temp1MAXNODESMAXNODES;int temp2MAXNODESMAXNODES;int temp; for(int k=0;k NodesCount;k+) for(int l=0;lNodesCount;l+) temp1kl=Connectkl;/初始化temp1矩阵 doSquareMatrix(&temp10,&temp20,NodesCount);/temp2=temp12 for(int k=0;k NodesCount;k+) for(int l=0;lNodesCount;l+) temp=temp1kl; temp1kl=temp2kl; temp2kl=temp; while(!IsSameMatrix(&temp10,&temp20,NodesCount);/直到收敛,也即temp2=temp22 cout可达矩阵如下:endl;printMatrix(&temp20,NodesCount); if(IsFull(&temp20,NodesCount)/任两点可达,图是连通的 return true; return false;3.3.2.4 数据结构的操作4/*函数原型:bool Graph:IsDirectWithoutLoop()*函数功能:判断一个图是否是有向无环图*实现方法:把一步可达矩阵对角线的元素变成0,然后这些矩阵 依次平方,直到收敛,如果是有向无环图,则对角线 上有非零的元素*/bool Graph:IsDirectWithoutLoop()if(IsUnDirectedGraph()|NodesCount=1)/单个结点或者无向图,就不是有向无环图return false;int AdjMAXNODESMAXNODES;int tempMAXNODESMAXNODES;int temp1, count=1; for(int k=0;k NodesCount;k+) for(int l=0;lNodesCount;l+) if(k!=l) Adjkl=Connectkl; else Adjkl=0;/对角元素为0 doSquareMatrix(&Adj0,&temp0,NodesCount);/temp=Adj2 count*=2; for(int k=0;k NodesCount;k+) if(tempkk!=0) return false; for(int l=0;lNodesCount;l+) temp1=tempkl; tempkl=Adjkl; Adjkl=temp1; while(count=NodesCount);/ cout如果下面矩阵对角线有非零元素,说明它是有环图endl; printMatrix(&temp0,NodesCount); for(int n=0;nNodesCount;n+) if(tempnn!=0) return false; if(!IsFull(&temp0,NodesCount,0)/如果如果这个矩阵全部是0,那么这是一个哈密顿图 cout这是一个哈密顿图!endl; return true;3.3.2.5 数据结构的操作5/*函数原型:void Graph:Prim(int v)*函数功能:仿照Prim算法,构建最大生成树*实现方法:从顶点v开始,选择剩下的顶点中与v相连的具有最小权值的边 加入到S集合中,然后不断在这两个集合里面找到两个点使得它们之间的权重是这个二分图里面最小的,直到集合S等于原来的顶点集为止*/void Graph:Prim(int v)bool IsUsedMAXNODES;/标记这个点是在哪个集合中float max=0;/记录最大权值int i,j,k,col,row;for(i=0;iNodesCount;i+)/NodesCount次循环IsUsedi=false;/初始化IsUsedv=true;for(i=1;iNodesCount;i+)max=0;for(j=0;jNodesCount;j+)for(k=0;kmax&AdjMatrixjkINF)/在两个集合里挑出两个元素,使得它们之间权值尽可能大max=AdjMatrixjk;/更新max的值row=j;col=k;IsUsedrow=IsUsedcol=true;/更新集合cout(row,col)权值为:maxendl;/输出边和权的构造过程3.3.2.6 数据结构的操作6/*函数原型:void Graph:floyd()*实现方法:弗洛伊德算法求任意两个点之间的最短距离*/void Graph:floyd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 历史期末专题复习提纲2024-2025学年统编版七年级历史下册
- 交通设备制造业数字化转型中的智能制造与产品生命周期管理实践报告
- 社区心理健康服务在2025年的发展现状与推广策略报告
- 智能信用体系在共享出行平台的应用与推广报告
- 国产医疗器械2025年市场竞争力:技术创新与品牌影响力分析报告
- 装备制造业2025年自主研发与产业链协同创新研究报告
- 生态修复工程2025年生物多样性保护与生态修复项目生态修复生态系统恢复路径研究报告
- 供应链金融如何优化中小企业供应链金融资源配置与风险管理报告
- 2025年养老地产市场需求变化与适老化产品设计趋势分析报告
- 2025年BIM技术在建筑项目全过程管理中的信息化管理与智能决策报告
- 2025年度次季度工业级5G专网部署技术服务合同模板
- 美导老师下店培训流程
- 湖北省潜江市十校联考2025届初三5月底中考模拟考试英语试题含答案
- 中央空调维保方案
- 2025年乡镇心理健康服务计划
- 气排球裁判试题库及答案
- 2025年周口理工职业学院单招职业技能考试题库附答案
- Unit 6 A great week (教学设计)-2024-2025学年外研版(三起)(2024)英语三年级下册
- 2025版小细胞肺癌免疫治疗专家共识解读
- 人工智能对人力资源管理的影响与转型
- GB/T 6433-2025饲料中粗脂肪的测定
评论
0/150
提交评论