7.3.3 图遍历算法的应用.pptx

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

7.3.3图遍历算法的应用;intConnect(AdjGraph*G) //判断无向图G的连通性

{inti,flag=1;

DFS(G,0); //调用DFS算法,从顶点0开始深度优先遍历

for(i=0;iG-n;i++)

if(visited[i]==0)

{flag=0;

break;

}

returnflag;

};【例7.9】假设图G采用邻接表存储,设计一个算法判断顶点u到顶点v之间是否有简单路径。;intvisited[MAXVEX]; //全局数组

intHasaPath(AdjGraph*G,intu,intv)

{ArcNode*p;

intw;

visited[u]=1;

p=G-adjlist[u].firstarc;//p指向u的第一个相邻点

while(p!=NULL)

{w=p-adjvex; //相邻点的编号为w

if(w==v) //找到顶点v后返回1

return1;

if(visited[w]==0) //若顶点w没有访问过

{if(HasaPath(G,w,v)) //从w出发进行深度优先遍历

return1; //若从w出发找到顶点v返回1

}

p=p-nextarc; //p指向下一个相邻点

}

return0; //没有找到顶点v,返回0

};从递归算法设计的角度求解本问题;【例7.10】假设图G采用邻接表存储,设计一个算法求顶点u到顶点v之间的一条简单路径(假设两顶点之间存在一条或多条简单路径)。;voidFindaPath(AdjGraph*G,intu,intv,intpath[],intd)

{ArcNode*p;intw,i;

visited[u]=1;

d++;path[d]=u; //顶点u加入到路径中

if(u==v) //找到一条路径

{for(i=0;i=d;i++) //输出找到一条路径并返回

printf(%d,path[i]);

printf(\n);

return;

}

p=G-adjlist[u].firstarc; //p指向u的第一个相邻点

while(p!=NULL)

{w=p-adjvex; //相邻点的编号为w

if(visited[w]==0)

FindaPath(G,w,v,path,d); //递归调用

p=p-nextarc; //p指向下一个相邻点

}

};【例7.11】假设图G采用邻接表存储,设计一个算法求顶点u到顶点v之间的所有简单路径(假设两顶点之间存在一条或多条简单路径)。;解:采用带回溯的DFS设计求解算法FindallPath(G,u,v,path,d)。

先置visited数组的所有元素值为0。

从顶点u开始,置visited[u]=1,将u放入path,若找到u的未访问过的相邻点u1,继续下去,若找不到u的未访问过的相邻点,置visited[u]=0以便u成为另一条路径上的顶点(这称为回溯);再从顶点u1出发,置visited[u1]=1,将u1放入path,若找到u1的未访问过的相邻点u2,继续下去,若找不到u1的未访问过的相邻点,置visited[u1]=0以便u1成为另一条路径上的顶点(回溯),…。

当找到的某个未访问过的相邻点un=v,说明path中存放的是顶点u到v的一条简单路径,输出path。

每次输出的path构成顶点u到v的全部简单路径中的一条,所有输出的path构成顶点u到v的全部简单路径。;voidFindallPath(AdjGraph*G,intu,intv,intpath[],intd)

{ArcNode*p;intw,i;

visited[u]=1;

d++;path[d]=u; //顶点u加入到路径中

if(u==vd=1) //找到一条长度=1的简单路径

{for(i=0;i=d;i++) //输出找到一条路径并返回

printf(%d,path[i]);

printf(\n);

}

p=G-adjlist[u].firstarc; //p指向u的第一个

文档评论(0)

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

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

1亿VIP精品文档

相关文档