以如下图的无向图G4为例,进行图的深度优先搜索:

假设从顶点v1出发进行搜索,在访问了顶点v1之后,选择邻接点v2。因为v2未曾访问,则从v2出发进行搜索。依次类推,接着从v、v8 、v5出发进行搜索。在访问了v5之后,由于v5的邻接点都已被访问,则搜索回到v8。由于同样的理由,搜索继续回到v4,v2直至v1,此时由于v1的另一个邻接点未被访问,则搜索又从v1到v3,再继续进行下去由此,得到的顶点访问序列为:

代码:

 /*    图的DFS遍历    */
//邻接矩阵形式实现
//顶点从1开始
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = ; //最大顶点数
typedef int VertexType; //顶点类型
bool vis[maxn]; struct Graph{ //邻接矩阵表示的图结构
VertexType vex[maxn]; //存储顶点
int arc[maxn][maxn]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}; void createGraph(Graph &g) //构建无向图
{
cout<<"请输入顶点数和边数:";
cin>>g.vexnum>>g.arcnum; //构造顶点向量
cout<<"请依次输入各顶点:\n";
for(int i=;i<=g.vexnum;i++){
scanf("%d",&g.vex[i]);
} //初始化邻接矩阵
for(int i=;i<=g.vexnum;i++){
for(int j=;j<=g.vexnum;j++){
g.arc[i][j] = ;
}
} //构造邻接矩阵
VertexType u,v; //分别是一条弧的弧尾(起点)和弧头(终点)
printf("每一行输入一条弧依附的顶点(空格分开):\n");
for(int i=;i<=g.arcnum;i++){
cin>>u>>v;
g.arc[u][v] = g.arc[v][u] = ;
}
} //邻接矩阵的深度优先递归算法
void DFS(Graph g,int i)
{
vis[i] = true;
printf("%d\t",g.vex[i]); //打印顶点
for(int j=;j<=g.vexnum;j++){ //遍历每个顶点
if(g.arc[i][j]== && !vis[j]){ //如果顶点j是顶点i的未访问的邻接点
DFS(g,j); //深度优先搜索顶点j
}
}
} //邻接矩阵的深度遍历操作
void DFSTraverse(Graph g)
{
for(int i=;i<=g.vexnum;i++){
vis[i] = false; //初始化所有顶点状态都是未访问过状态
}
for(int i=;i<=g.vexnum;i++){
if(!vis[i]){
DFS(g,i); //对未访问的顶点调用DFS,若是连通图,只会执行一次
}
}
} int main()
{
Graph g;
createGraph(g);
DFSTraverse(g);
return ;
}

DFS实现模板的更多相关文章

  1. DFS 算法模板

    dfs算法模板: 1.下一层是多节点的dfs遍历 def dfs(array or root, cur_layer, path, result): if cur_layer == len(array) ...

  2. DFS算法(——模板习题与总结)

    首先,需要说明的是搜索算法本质上也是枚举的一种,时间复杂度还是很高的,遇到问题(特别是有水平的比赛上),不要优先使用搜索算法. 这里总结一下DFS算法: 1.从图中某个顶点出发,访问v. 2.找出刚访 ...

  3. 图的dfs遍历模板(邻接表和邻接矩阵存储)

    我们做算法题的目的是解决问题,完成任务,而不是创造算法,解题的过程是利用算法的过程而不是创造算法的过程,我们不能不能陷入这样的认识误区.而想要快速高效的利用算法解决算法题,积累算法模板就很重要,利用模 ...

  4. 图的遍历(bfs+dfs)模板

    bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...

  5. Toposort(拓扑排序)dfs递归模板

    最近刷了几题拓扑排序的题,记录一下拓扑排序 在有向图中,并且按照一定的规则(题目所给的规则)排序.如果图中出现了有向环的话就无法排序了. int gap[maxn][maxn];//记录下有向边 in ...

  6. 图论--树的重心(DFS) 模板

    const int maxn=500005; int tot=0,n; int ans,size; int sx[maxn],head[maxn]; int vis[maxn]; struct edg ...

  7. dfs初步模板解析

    #include<stdio.h> int a[10],book[10],n; //这里还有需要注意的地方C语言全局变量默认为0 void dfs(int step){ //此时在第ste ...

  8. DFS普及组常用模板简单整理

    一些普及组会用到的DFS模板,其他的DFS我感觉普及组不会用到所以暂且搁着,等之后有时间了再细写w (至于我为什么最近不写TG相关只写最基础的PJ的内容,请戳这里了解) dfs各种模板big集合 1. ...

  9. 求强连通分量模板(tarjan算法)

    关于如何求强连通分量的知识请戳 https://www.byvoid.com/blog/scc-tarjan/ void DFS(int x) { dfn[x]=lowlink[x]=++dfn_cl ...

随机推荐

  1. React Router 4 的使用(2)

    Route Rendering Props 对于给定的路由如何渲染组件,有三种选项:component.render.children.你可以查看 <Route> 的文档来获取更多的信息, ...

  2. 使用补丁破解IntelliJ IDEA 2017收费版本(转)

    1. 首先去官网http://www.jetbrains.com/idea/download/#section=windows下载Ultimate版(注意不是community版)下载并安装.一定要记 ...

  3. PThread 学习笔记

    POSIX 线程,也被称为Pthreads,是一个线程的POSIX标准: pthread.h int pthread_create(pthread_t * thread, pthread_attr_t ...

  4. ZLG zigbee 虚拟串口配置

    一.设置网关工作模式: 在ZNetCom Utility工具中,将设置网关工作模式为 Real COM 模式 启动 ZNetCom Utility 搜索设备 获得设备信息 修改工作模式为:real c ...

  5. zepto 基础知识(1)

    1.$() 的用法. 获取元素 $('div') //获取所有页面中的div元素 $('#foo') // 获取ID 为"foo"的元素 创建元素 $("<p> ...

  6. 【剑指offer】 Java实现重建二叉树

    GitHub上的代码链接 /** * @Author: DaleyZou * @Description: 重建二叉树 * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. * 假设输入的前序 ...

  7. [HAOI2007]上升序列(最长上升子序列)

    题目描述 对于一个给定的 S=\{a_1,a_2,a_3,…,a_n\}S={a1​,a2​,a3​,…,an​} ,若有 P=\{a_{x_1},a_{x_2},a_{x_3},…,a_{x_m}\ ...

  8. jQuery-qrcode.js 生成带Logo 的二维码

    引入文件  jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...

  9. php将html页面截图并保存成图片

    采用html5的canvas,将图片绘制到画布上,然后用canvas的 toDataURL 方法. 但是在图片转base64的过程中遇到了两个问题, 1:图片无法绘制,转成的base64 用浏览器打开 ...

  10. 网站漏洞修复之最新版本UEditor漏洞

    UEditor于近日被曝出高危漏洞,包括目前官方UEditor 1.4.3.3 最新版本,都受到此漏洞的影响,ueditor是百度官方技术团队开发的一套前端编辑器,可以上传图片,写文字,支持自定义的h ...