博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图的深度优先遍历
阅读量:4971 次
发布时间:2019-06-12

本文共 1123 字,大约阅读时间需要 3 分钟。

图的遍历方式有两种,分别是图的深度优先遍历和图的广度优先遍历

其中,深度优先遍历的应用更为广泛。

深度优先遍历同深度优先搜索,“不撞南墙不回头”

从一个点A出发再访问所有与之相连且未被访问过的点,如果全部被

访问过,就退回上一个点继续访问,我们可以用一个visited数组来

记录点是否被访问过,整个过程可以用递归实现。

 

比如上面这个图,它的深度优先遍历的顺序(从v1出发)

v1-v2-v5-v3-v4-v6(顺序可能不同)

 

再比如这个c图(树是特殊的图-有向无环图),它的深度优先遍历顺序是

v1-v2-v4-(没有与四相连未被访问过的点,退回V2)-v5-(退回V2,退回v1)-v3-v6-(退回v3)-v7

更加直观。

 

Code:

#include
#include
using namespace std;struct node{ int end; int len; int next;} ;node edge[2333];int n,m,first[2333],visited[2333],cnt;void add_edge(int s,int e,int d){ cnt++; edge[cnt].end=e; edge[cnt].len=d; edge[cnt].next=first[s]; first[s]=cnt; return;}void dfs(int s){ visited[s]=true; printf("%d ",s); for(int i=first[s];i!=0;i=edge[i].next) { if(!visited[i]) dfs(i); } return;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int s,e,d; scanf("%d%d%d",&s,&e,&d); add_edge(s,e,d); add_edge(e,s,d); } for(int i=1;i<=n;i++) { if(!visited[i]) dfs(i); printf("\n"); } return 0;}

/使用边表存图./

转载于:https://www.cnblogs.com/Hoyoak/p/10460178.html

你可能感兴趣的文章
SpringBoot2.x整合Redis缓存自定义序列化
查看>>
20145219 gdb调试汇编堆栈分析
查看>>
django复习--什么是MTV模式
查看>>
iOS开发工具——网络封包分析工具Charles
查看>>
完整的温度转换程序
查看>>
循环cin读入如何终止
查看>>
Spring Framework--Data Access(1)--Transaction Management(2) - 声明式事务管理(2)
查看>>
假性进度效果
查看>>
团队项目:6.28日报
查看>>
MFC添加子对话框及如何初始化
查看>>
uva11021
查看>>
Ubuntu14.04安装和配置Tomcat8.0.12
查看>>
清除css浮动问题
查看>>
opengl混合效果
查看>>
检测一个文本文件的编码是否为GBK
查看>>
如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作...
查看>>
jvm与tomcat启动优化配置
查看>>
Linux——通配符
查看>>
hihoCoder 1032 : 最长回文子串
查看>>
错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误
查看>>