- 1、本文档共119页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
以邻接表为存储结构的深度优先搜索算法: void DFS(ALGraph *G,int v) //邻接表的DFS算法 { ArcNode *p; printf(%3d,v); //输出被访问顶点的编号 visited[v]=1; //置已访问标记 p=G-adjlist[v].firstarc; //p指向顶点v的第一个邻接点 while (p!=NULL) { if (visited[p-adjvex]==0) //若p-adjvex顶点未访问,递归访问它 DFS(G,p-adjvex); p=p-nextarc; //p指向顶点v的下一个邻接点 } } 【例4.6】假设图G采用邻接表存储,设计一个算法判断图G中从顶点u到v是否存在简单路径。 解:所谓简单路径是指路径上的顶点不重复。采用深度优先遍历的方法,从顶点u出发搜索到顶点v的过程如下: DFS(G,u,v) DFS(G,u1,v) DFS(G,v,v) … bool ExistPath(ALGraph *G,int u,int v) //判断G中从顶点u到v是否存在简单路径 { int w; ArcNode *p; visited[u]=1; //置已访问标记 if (u==v) //找到了一条路径,返回true return true; p=G-adjlist[u].firstarc; //p指向顶点u的第一个相邻点 while (p!=NULL) { w=p-adjvex; //w为顶点u的相邻顶点 if (visited[w]==0) //若w顶点未访问,递归访问它 { bool flag=ExistPath(G,w,v); if (flag) return true; } p=p-nextarc; //p指向顶点u的下一个相邻点 } return false; //没有找到v,返回false } 【例4.7】假设图G采用邻接表存储,设计一个算法输出图G中从顶点u到v的一条简单路径(假设图G中从顶点u到v至少有一条简单路径)。 解:采用深度优先遍历的方法,f(G,u,v,apath,path)搜索图G中从顶点u到v的一条简单路径path。 通过顶点u在图G中搜索,当u=v时说明找到一条从u到v的简单路径,将apath复制到path中并返回。否则继续深度优先遍历。 void FindaPath(ALGraph *G,int u,int v,vectorint apath, vectorint path) { int w; ArcNode *p; visited[u]=1; apath.push_back(u); //顶点u加入到apath路径中 if (u==v) //找到一条路径 { path=apath; //将apath复制到path return; //返回true } p=G-adjlist[u].firstarc; //p指向顶点u的第一个相邻点 while (p!=NULL) { w=p-adjvex; //相邻点的编号为w if (visited[w]==0) FindaPath(G,w,v,apath,path); p=p-nextarc; //p指向顶点u的下一个相邻点 } } 4.4.4 广度优先遍历 广度优先搜索的过程是: (1)首先访问初始顶点v。 (2)接着访问顶点v的所有未被访问过的邻接点v1,v2,…,vt。 (3)然后再按照v1,v2,…,vt的次序,访问每一个顶点的所有未被访问过的邻接点,依次类推,直到图中所有和初始顶点v有路径相通的顶点都被访问过为止。 以邻接矩阵为图的存储结构,采用广度优先搜索图时,需要使用一个队列。 void BFS(MGraph g,int v) //邻接矩阵的BFS算法 { queueint qu; //定义一个队列qu int visited[MAXV]; //定义存放结点的访问标志的数组 int w,i; memset(visited,0,sizeof(visited)); //访问标志数组初始化 printf(%3d,v); //输出被访问顶点的编号 visited[v]=1; //置已访问标记 qu.push(v); //v进队 while (!qu.empty()) //队列不空时循
文档评论(0)