图深度优先搜索遍历算法分析和其应用.doc

图深度优先搜索遍历算法分析和其应用.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图深度优先搜索遍历算法分析和其应用

图的深度优先搜索遍历算法分析及其应用 摘 要:文章介绍了图论,图的基本概念及其图的表示方法。详细的分析了图中以邻接表为存储结构进行的图的深度优先搜索遍历的算法,并且在VC++环境中实现其算法的过程,对运行记过做了一定量的分析,最后介绍了基于该算法的一些应用。 关键词:图;深度优先搜索;遍历;算法 图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。 图(Graph)是一种较线性表和树更复杂的数据结构,图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,在研究有关图的问题时,要考虑图中每个顶点的信息,访问图中的各个顶点,而访问图中各个顶点的操作过程即使图的遍历,图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。 1 图的三元组定义 图G是一个三元组由集合V,E和关联函数组成,记为:G=(V,E,W(G))。其中V是顶点的集合,表示V(G)={V1,V2,V3,……Vn},V(G)≠NULL。E是V中的点偶对的有穷集,表示为E(G)={e1,e2,e3……em},其中ei为<V j,Vt>或{Vj,Vt},若ei为{Vj,Vt},称ei为以V j 和Vt为端点的无向边;若ei为<Vj,Vt>,称ei为以V j为起点,Vt为终点的有向边;W(G)称为E→VxV的关联函数。 2图的存储结构   图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重表。邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。 V2V1 V2 V1 V5V4V3 V5 V4 V3 图1 无向图G 该图的G的邻接表表示如下: 为了便于理解,本文以无向图G作为具体示例(如图1所示),给出以邻接表进行存储的图的数据结构。 现将图G的各顶点进行编号,其对应的邻接表如图2所示: V1 V2 V3 V4 V5 3 1 ∧ 4 2 0 ∧ 4 3 1 ∧ 2 0 ∧ 1 ∧ 2 图2图G的邻接表表示 2.1邻接表的数据结构定义,将图G采用邻接表存储。其结构有: #include "iostream.h" int *visited; //存放当前结点是否遍历 typedef int **MGraph;//定义一个二维数组存放邻接矩阵,暂不定义矩阵大小,数据元素类型为整型 //把矩阵看作数组元素是一维数组的一个一维数组 struct ArcNode{ //定义邻接表中的边结点类型 int adjvex; //邻接点位置 int weight; //权值 ArcNode *nextarc; //指向下一个边结点的链域 }; struct VNode{ int data; ArcNode *nextarc; };//邻接表表头结点 typedef VNode *adjlist; //邻接矩阵存储方式 void InitGraph(MGraph &G,int n) //建立n行n列的二维数组 { G=new int *[n];//分配第一维空间 int i,j; for(i=0;i<n;i++) G[i]=new int[n];//分配第二维空间 for(i=0;i<n;i++) for(j=0;j<n;j++) G[i][j]=0;//初始情况下没有连接 } 2.2构造算法: void CreateGraph(MGraph &G,int n){//建立无向图,其它形式的图可以自己建立 int i,j,e; cout<<"输入无向图中边的总数量"; cin>>e; cout<<"\n输入每条边的起点和终点序号(注:结点编号范围为0~n-1):\n"; for(int k=1;k<=e;k++){ cout<<"\n第"<<k<<"对边:"; cin>>i>>j; if(i>n||j>n||i<0||j<0) return; G[i][j]=G[j][i]=1;} } //初始化 void InitAdj(adjlist &G,

文档评论(0)

sy78219 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档