数据结构图的遍历与连通性C.ppt

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

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

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

1亿VIP精品文档

相关文档