数据结构第17讲图及遍历及连通性C.ppt

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

7.2 图的存储结构 图的数组(邻接矩阵)存储表示 图的邻接表存储表示 有向图的十字链表存储表示 无向图的邻接多重表存储表示 邻接矩阵是用于描述图中顶点之间关系(即弧或边的权)的矩阵。 邻接表类似树的孩子链表。即对图中的每个顶点vi建立一个单链表,表中结点表示依附于该顶点vi的边或弧。 3.有向图的十字链表存储表示 4.无向图的邻接多重表存储表示 7.3 图的遍历 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做图的遍历。 通常有两条遍历图的路径: 深度优先搜索 广度优先搜索 1.深度优先搜索(DFS) 分析: 在遍历图时,对图中每个顶点至多调用一次DFS函数,因为一旦某个顶点被标志成已被访问,就不再从它出发进行搜索。 因此,遍历图的过程实质上是对每个顶点查找其邻接点的过程。其耗费的时间则取决于所采用的存储结构。 2.广度优先搜索(BFS) BFS非递归算法 void BFSTraverse(Graph G, Status (*Visit)(int v)){ //使用辅助队列Q和访问标志数组visited[v] for (v=0; vG.vexnum; ++v) visited[v] = FALSE; InitQueue(Q); // 置空的辅助队列Q for ( v=0; vG.vexnum; ++v ) if ( !visited[v]) { // v尚未访问 visited[v] = TRUE; Visit(v); EnQueue(Q, v); // v入队 while (!QueueEmpty(Q)) { DeQueue(Q, u); // 队头元素出队并置为u for (w=FirstAdjVex(G,u);w=0;w=NextAdjVex(G,u,w)) if ( ! visited[w]){ //w为u的尚未访问的邻接顶点 visited[w] = TRUE; Visit(w); EnQueue(Q, w); } //if } //while }if } // BFSTraverse 分析: 每个顶点至多进一次队列。遍历图的过程实质上是通过边或弧找邻接点的过程,因此广度优先搜索遍历图的时间复杂度和深度优先搜索遍历相同,两者不同之处仅仅在于对顶点访问的顺序不同。 7.4 图的连通性问题 1)无向图的连通分量和生成树 2)最小生成树 3)普里姆算法 4)克鲁斯卡尔算法 1.无向图的连通分量和生成树 基本概念 连通分量的顶点集:即从该连通分量的某一顶点出发进行搜索所得到的顶点访问序列; 生成树:某连通分量的极小连通子图; 生成森林:非连通图的各个连通分量的极小连通子图构成的集合。 设E(G)为连通子图G中所有边的集合,则从图中任一顶点出发遍历图时,必定将E(G)分成两个集合T(G)和B(G),其中T(G)是遍历过程中历经的边的集合。显然,T(G)和图G中所有顶点一起构成连通图G的极小连通子图,按照7.1节的定义,它是连通图的一棵生成树,并且称由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。 对非连通图,每个连通分量中的顶点集和遍历时走过的边一起构成若干棵生成树,这些连通分量的生成树组成非连通图的生成森林。 例: 生成非连通图的深度优先生成森林的算法 void DFSTree (Graph G,int v,CSTree T){ //从第v个顶点出发深度优先遍历图Q,建立以T为根的生成树。 visited[v]=TRUE; first=TRUE; for(w=FisrtAdjVex(G,v); w=0; w=NextAdjVex(G, v, w)) if(!visited[w]){ p=(CSTree)malloc(sizeof(CSNode)); //分配孩子结点 *p={GetVex(G,w),NULL,NULL}; if(first){ //w是v的第一个未被访问的邻接顶点 T—lchild=p;first=FALSE;//是根的左孩子结点 } else { //w是v的其它未被访问的邻接顶点 q—nextsibling =p;//是上一邻接顶点的右兄弟结点 } q = p; DFSTree(G, w, q);

文档评论(0)

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

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

1亿VIP精品文档

相关文档