图的深度优先搜索的过程:

(1)从图的某个顶点V出发,访问V.

(2)找出刚访问过的顶点的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直到

刚顶点没有未bedi被访问的邻接点为止。

(3)返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该din

顶点的下一个未被访问的邻接点,访问该顶点。

(4)重复步骤(2)和(3),直到图中所有的顶点都被访问过,搜索结束。

例如,上图的深度遍历过程如下:

(1)从a顶点出发,访问a。

(2)从a出发,访问第一个未被访问的邻接点b,访问b。以b作为新的起点,重复此步骤,访问e,c,d。

对于图的邻接表和邻接矩阵有不同的实现方式:

当图采用邻接表表示时:

//采用邻接表表示的图的深度优先搜索
void DFS(ALGraph G,int v)
{//图G为邻接表类型cout<<G.vertices[v].data;visited[v]=true;//访问第v个顶点,并置为trueArcNode *p;p=G.vertices[v].firstarc;//p指向v的边链表的第一个边结点while(p!=NULL)//边结点非空{int w=p->adjvex;      //表示w是v的邻接点if(!visited[w]) DFS(G,w);//如果w未访问,递归p=p->nextarc;//      p指向下一个边结点}
}

当图采用邻接矩阵表示时:

//采用邻接矩阵表示图的深度优先遍历
void DFS_AM(AMGraph &G, int v){cout<<G.vexs[v];visited[v]=true;for(int w=0;w<G.vexnum;w++){if(G.arcs[v][w]!=0 && (!visited[w])){DFS_AM(G, w);}}
}

代码的具体实现如下:

1.

#include<stdio.h>
#include<stack>
#include <iostream>
#define MAXSIZE 100
#define MaxInt 32767 //表示最大值,即正无穷大
#define MVNum 100 //定义最大顶点数
using namespace std;//========================使用邻接表法表示图============================
typedef char VerTexType; //定义顶点数据类型为字符型
typedef int ArcType; //定义边的权值类型为整型
//定义边结点
typedef struct ArcNode{int adjvex; //该边所指向顶点的位置struct ArcNode *nextarc; //指向下一条边的指针
}ArcNode;
//定义顶点结点信息
typedef struct VNode{VerTexType data; ArcNode *firstarc; //指向依附于该顶点的边的指针
}VNode, AdjList[MVNum];
//定义连接表结构
typedef struct{AdjList vertices;int vexnum, arcnum; //当前图的顶点数和边数
}ALGraph; bool visited[MVNum]; //访问标志数组,初试为false //==============================图的遍历和创建================================= //确定顶点vex在G.vertices中的序号
int LocateVex(ALGraph &G, VerTexType vex){for(int i=0;i<G.vexnum;i++){if(G.vertices[i].data==vex){return i;}}
}//邻接表法创建无向图
void CreateUGD(ALGraph &G){printf("输入总顶点数:");cin>>G.vexnum;printf("输入总边数:");cin>>G.arcnum;//输入各个顶点,构造邻接表的表头结点表for(int i=0;i<G.vexnum;i++){printf("请输入第%d个顶点的信息:", (i+1));cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;} //输入各边,构造邻接表for(int k=0;k<G.arcnum;k++){printf("请输入第%d条边的信息:\n", (k+1));printf("请输入边依附的第1个顶点:");VerTexType v1;cin>>v1;printf("请输入边依附的第2个顶点:");VerTexType v2;cin>>v2;//确定v1,v2在图G中的位置,即在G.vertices中的序号 int i=LocateVex(G, v1);int j=LocateVex(G, v2);struct ArcNode *p1, *p2;p1=new ArcNode; //生成一个新的边结点 p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;p2=new ArcNode; //生成另一个对称边结点p2 p2->adjvex=i;p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;}
} //遍历图的邻接表
void PrintfG(ALGraph &G){printf("遍历图的邻接表:\n");for(int i=0;i<G.vexnum;i++){printf("顶点%c ", G.vertices[i].data);ArcNode *p;p=G.vertices[i].firstarc;while(p){printf("%d ", p->adjvex);p=p->nextarc;}}printf("\n");
}//采用邻接表表示的图的深度优先搜索
void DFS(ALGraph G,int v)
{//图G为邻接表类型cout<<G.vertices[v].data;visited[v]=true;//访问第v个顶点,并置为trueArcNode *p;p=G.vertices[v].firstarc;//p指向v的边链表的第一个边结点while(p!=NULL)//边结点非空{int w=p->adjvex;      //表示w是v的邻接点if(!visited[w]) DFS(G,w);//如果w未访问,递归p=p->nextarc;//      p指向下一个边结点}
}int main(){ALGraph G;CreateUGD(G);PrintfG(G);//初始化访问数组for(int i=0;i<MVNum;i++){visited[i]=false;} DFS(G, 0);
} 

2.

#include<stdio.h>
#include<stack>
#include <iostream>
#define MAXSIZE 100
#define MaxInt 32767 //表示最大值,即正无穷大
#define MVNum 100 //定义最大顶点数
using namespace std;typedef char VerTexType;//假设顶点数据类型为字符型
typedef int ArcType;//假设边的权值为整型
typedef struct {VerTexType vexs[MVNum];//顶点表 ArcType arcs[MVNum][MVNum];//邻接矩阵int vexnum,arcnum;//图的当前顶点数和边数
}AMGraph;bool visited[MVNum]; //访问标志数组,初试为false //查找一个顶点在图G中的位置
int LocateVex(AMGraph &G, VerTexType vex){for(int i=0;i<G.vexnum;i++){if(G.vexs[i]==vex){return i;}}
}//采用邻接矩阵表示法创建无向网
/*
1.输入总订单数和总边数;
2.依次输入点的信息,存入顶点表;
3.初始化邻接矩阵,每个边的权值初始化为最大值;
4.构造邻接矩阵:依次输入每条边依附的顶点和边的权值,确定两个顶点在图中的位置,
之后使相应的边赋予相应的权值,同时使其相对称的边赋予同样的权值。
*/
void CreateUDN(AMGraph &G){printf("请输入总顶点数:");scanf("%d",&G.vexnum);printf("请输入总边数:");scanf("%d", &G.arcnum);for(int i=0;i<G.vexnum;++i){printf("请输入第%d个顶点的信息:", (i+1));cin>>G.vexs[i];}printf("\n");//初始化邻接矩阵 for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++){G.arcs[i][j]=MaxInt;}}//构造邻接矩阵for(int k=0;k<G.arcnum;k++){printf("请输入第%d条边的信息(边的顶点和权值):\n", (k+1));printf("请输入边的第一个顶点:");VerTexType v1;//scanf("%c", &v1);cin>>v1; printf("请输入边的第二个顶点:");VerTexType v2;//scanf("%c", &v2);cin>>v2;printf("请输入边的权重:");ArcType weight;scanf("%d", &weight);  //确定v1和v2在G中的位置,即顶点数组的下标int i=LocateVex(G, v1);printf("v1在图G中的位置:%d\n", i); int j=LocateVex(G, v2);printf("v2在图G中的位置:%d\n", j); G.arcs[i][j]=weight;G.arcs[j][i]=G.arcs[i][j];}
} //输出图的邻接矩阵
void PrintAM(AMGraph &G){printf("\n输出图的邻接矩阵:\n");for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++){if(G.arcs[i][j]==MaxInt){G.arcs[i][j]=0;printf("%d ", G.arcs[i][j]);}else{printf("%d ", G.arcs[i][j]);}}printf("\n");}
}//采用邻接矩阵表示图的深度优先遍历
void DFS_AM(AMGraph &G, int v){cout<<G.vexs[v];visited[v]=true;for(int w=0;w<G.vexnum;w++){if(G.arcs[v][w]!=0 && (!visited[w])){DFS_AM(G, w);}}
} int main(){AMGraph G;CreateUDN(G);PrintAM(G);//初始化访问数组for(int i=0;i<MVNum; i++){visited[i]=false;} DFS_AM(G, 0);
} 

图的深度优先搜索-递归相关推荐

  1. 【数据结构】图的深度优先搜索

    图的深度优先搜索类似于树的深度优先搜索.不同的是,图中可能包括循环,即我们有可能重复访问节点.为了避免访问已经访问过的节点,我们要使用一个布尔变量的数组. 例如,在下图中,我们从节点2开始访问.当访问 ...

  2. 图的深度优先搜索及拓扑排序

    本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍). 1. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优 ...

  3. 采用邻接矩阵形式存储图,进行图的深度优先搜索并输出结果。

    内容: 采用邻接矩阵形式存储图,进行图的深度优先搜索并输出结果. 步骤: 算法分析 本题需要利用邻接矩阵的形式存储图,并对图进行深度优先搜索并输出结果.大体上可以分为两个部分,一是采用邻接矩阵的方式存 ...

  4. 图的深度搜索c语言,求图的深度优先搜索!该怎么处理

    当前位置:我的异常网» C语言 » 求图的深度优先搜索!该怎么处理 求图的深度优先搜索!该怎么处理 www.myexceptions.net  网友分享于:2013-03-16  浏览:12次 求图的 ...

  5. 邻接矩阵实现图的深度优先搜索(1)

    邻接矩阵实现图的深度优先搜索(1) /************************************************************/ /****************** ...

  6. 图的深度优先搜索(DFS)

    今天又复习了图的深度优先搜索,深深感觉了深搜就是外挂,岂止是外挂,简直就是外挂,动态规划做不出来的,深搜搜出来了,贪心贪不出来的深搜搜出来了,连并查集,拓扑排序做不出来的,深搜都做出来了,很遗憾以前深 ...

  7. 基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归)

    基础背包问题 - 多维有界背包问题 - 深度优先搜索 (递归) 1. 基础背包问题 背包问题 (Knapsack problem) 是一种组合优化的 NP 完全问题.给定一组物品,每种物品都有自己的重 ...

  8. 深度优先遍历和广度优先遍历_图与深度优先搜索和广度优先搜索

    什么是图? 图是一种复杂的非线性表结构.由若干给定的点一级任意两点间的连线所构成.图通常用来描述事物之间的特定关系, 代表的就是事物, 线就是事物之间所具有的关系.例如社交网络就是一种典型的图关系, ...

  9. dfs深度优先搜索_图的深度优先搜索(DFS)

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

最新文章

  1. CSDN七夕包分配,最后一天啦!
  2. ajax请求挂起_Ajax请求内部循环挂起浏览器?
  3. 如何用指针访问opencv cv::Mat数据?ptr<uchar>()
  4. java学习笔记 2022.2.11
  5. oracle set markup,oracle sql*plus set spool介绍(二)
  6. 【工作感悟】成功入职阿里月薪45K
  7. mysql在单片机移植_移植MySQL到嵌入式ARM平台
  8. 元学习Meta Learning/Learning to learn
  9. 计算机表格斜杠怎么打,excel表格斜杠怎么分隔打字(怎么在excel里一个表格内划斜线并添加文字)...
  10. Dubbo服务调用流程源码分析(服务调提供方)
  11. 【数学建模】论文排版
  12. 签offer VS 签三方
  13. Hanoi塔(汉诺塔/梵天塔)问题
  14. 【ChatGPT】ChatGPT使用指南——句词分类
  15. 解决网页文字无法复制
  16. 万字长文测评:3款口碑炸裂的BI数据分析工具,最好用的其实是……
  17. 从CSDN到个人博客空间
  18. python使用turtle库绘制一个100长度的十字架_使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例...
  19. 6S-7PIOS14~14.7.1密码界面越狱教程
  20. 【新学期、新Flag】例文:我的新学期Flag

热门文章

  1. Matlab录制语音
  2. 成功的秘密--隐姓的亿万富翁
  3. 苏格拉底对失恋者说的话
  4. Android中的Drawable(三)
  5. java中实现创建目录、创建文件的操作
  6. Resnet实现CIFAR-10图像分类
  7. requests_html快速爬取数据
  8. 基于PHP+MySQL的论坛管理系统
  9. 勿做上司最讨厌的九种人
  10. UML建模语言中的顺序图