一、深度优先搜索(Depth-First-Search 简称:DFS)

1.1 遍历过程:

(1)从图中某个顶点v出发,访问v。

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

(3)返回到步骤(2)中的被顶点v访问的,且还没被访问的邻接点,找出该点的下一个未被访问的邻接点,访问该顶点。

(4)重复(2) (3) 直到每个点都被访问过,遍历结束。

例无权图:(默认为字母顺序)

(1)从顶点A出发,访问该图

(2)A的邻接点为BEF 以B为顶点开始访问 B的邻接点有FDC

(3)B的所有的点均被访问结束,访问顶点C 顶点C还有F没有被访问

,结束遍历。

故遍历结果为 A->B->C->D->E->F

有向图:(默认为字母顺序)

(1)从顶点A出发,访问该图

(2)A 的出路顶点为B、D ,从顶点B 开始访问, B的出路只有E 结束此路;

(3)开始访问顶点D,D的出路为顶点C和F 此时所有顶点都被遍历了,结束;

故遍历结果为: A->B->E->D->C->F

1.2 算法描述

自然语言:从图中的某个顶点v出发,访问v,并将visited[v]的值为true。

一次检查v的所有邻接点w,如果visited[w]的值为flase,再从w出发进行递归遍历,直到图中的所有顶点都被访问过。

伪代码:

递归算法:

visited[MVNum]

count

for(w=0;w

if(!visited[w]  DFS[G,w]);

采用邻接矩阵表示:

//输入图G(V,E),w表示v的邻接点

//输出邻接矩阵

count

for(w

if( (G.arcs[v][w]!=0)&&(!visited[w])  )

DFS(G,w);

采用邻接表:

count

p

while(p!=NULL) do

wadjvex;

if(!visited[w]) do DFS(G,w)

pnextarc;

1.3用途:检查图的连通性和无环性

1.4总结:每个顶点至多进一次队列。遍历图的过程实质上市通过边找邻接点的过程。因此DFS时间复杂度,当用邻接矩阵表示图时为O(n2),其中n为图中的顶点数,当以邻接表做图的存储结构时,时间复杂度为O(e)这里e为 图中的边数,因此,当以邻接表为存储结构时,DFS时间复杂度为O(n+e)。

二、广度优先搜索(Breadth-First-Search 简称:BFS)

2.1遍历过程如下:

(1)从图中某个顶点v出发,访问v。

(2)依次访问v邻接各个未访问过的的所有顶点

(3)接着从这些邻接顶点中继续访问它们的邻接顶点,遵循原则 先被访问的顶点的邻接点 先于 后被访问的顶点的邻接点 被访问。重复(3)步骤,直至所有的顶点都被访问过。

这里的“先被访问的顶点的邻接点 ”指的是在第二步骤先访问的顶点然后再先访问他的邻接点,包括后来的第三步骤也是这个意思,均为上一步骤 先访问的顶点然后再先访问他的邻接点。

例:图还是上面的那张无权图

我们按照字母ABCDEF这样的顺序来排列

(1)以A为顶点,开始遍历

(2)A的三个邻接点BEF

(3)根据字母顺序 从点B开始访问 B的临界点有CD 此时,所有的顶点均被访问

故,遍历后的结果为 A ->B-> E-> F-> C-> D

若为有向图

(1)根据字母顺序,先从顶点A开始访问

(2)看顶点A的出路,邻接点为B,D 。根据字母顺序,下一个顶点从B开始

(3)顶点B的出路为E ,且E没有出路了,故此路结束

(4)回到和B点同一级的 还有顶点D还没有被访问 D的出路有两条,分别为邻接点C 和F ,此时所有的顶点都被访问过。

故 遍历后的顺序为 A->B->D->E->C->F

2.2算法描述

自然语言:从图 中的某个顶点v出发,访问v,并将visited[v]的值为true,然后将v进队

只要队列不空,则重复下述处理:

队头顶点u出队

依次检查u的所有邻接点w,如果visited[w]的值为false,则访问w,并将visited[w]的数值为true,然后将w入队;

伪代码: //BFS算法描述

//输入:图G=

//输出:图G的BFS遍历后的先后次序

visited[v]

InitQueue(Q);

EnQueue(Q,v);

while(!QueueEmpty(Q))  do

DeQueue(Q,u);

for(w =0;w

if(!visited[w]) do

count<

EnQueue(Q,w);

2.3用途:计算最短路径问题

2.4.总结:每个顶点至多进一次队列。遍历图的过程实质上市通过边找邻接点的过程。因此BFS时间复杂度,当用邻接矩阵表示图时为O(n2),其中n为图中的顶点数,当以邻接表做图的存储结构时,时间复杂度为O(e)这里e为 图中的边数,因此,当以邻接表为存储结构时,BFS时间复杂度为O(n+e)。

具体的代码实现如下所示:

#include

#define N 20

#define TRUE 1

#define FALSE 0

int visited[N]; /*访问标志数组*/typedefstruct /*队列的定义*/{intdata[N];intfront,rear;

}queue;

typedefstruct /*图的邻接矩阵*/{intvexnum,arcnum;charvexs[N];intarcs[N][N];

}

graph;void createGraph(graph *g); /*建立一个无向图的邻接矩阵*/

void dfs(int i,graph *g); /*从第i个顶点出发深度优先搜索*/

void tdfs(graph *g); /*深度优先搜索整个图*/

void bfs(int k,graph *g); /*从第k个顶点广度优先搜索*/

void tbfs(graph *g); /*广度优先搜索整个图*/

void init_visit(); /*初始化访问标识数组*/

/*建立一个无向图的邻接矩阵*/

void createGraph(graph *g)

{inti,j;charv;

g->vexnum=0;

g->arcnum=0;

i=0;

printf("\n输入顶点序列(以#结束):\n");while ((v=getchar())!='#')

{

g->vexs[i]=v; /*读入顶点信息*/i++;

}

g->vexnum=i; /*顶点数目*/

for (i=0;ivexnum;i++) /*邻接矩阵初始化*/

for (j=0;jvexnum;j++)

g->arcs[i][j] = 0;/*(1)-邻接矩阵元素初始化为0*/printf("\n输入边的信息(顶点序号,顶点序号),以(-1,-1)结束:\n");

scanf("%d,%d",&i,&j); /*读入边(i,j)*/

while (i!=-1) /*读入i为-1时结束*/{

g->arcs[i][j] = 1; /*(2)-i,j对应边等于1*/g->arcnum++;

scanf("%d,%d",&i,&j);

}

}/*createGraph*/

/*(3)---从第i个顶点出发深度优先搜索,补充完整算法*/

void dfs(int i,graph *g)

{intj;

printf("%c", g->vexs[i]);

visited[i]=TRUE;for (j = 0; j < g->vexnum; j++)if (g->arcs[i][j] == 1 && !visited[j])

dfs(j, g);

}/*dfs*/

/*深度优先搜索整个图*/

void tdfs(graph *g)

{inti;

printf("\n从顶点%C开始深度优先搜索序列:",g->vexs[0]);for (i=0;ivexnum;i++)if (visited[i] != TRUE) /*(4)---对尚未访问过的顶点进行深度优先搜索*/dfs(i,g);

printf("\n");

}/*tdfs*/

/*从第k个顶点广度优先搜索*/

void bfs(int k,graph *g)

{inti,j;

queue qlist,*q;

q=&qlist;

q->rear=0;

q->front=0;

printf("%c",g->vexs[k]);

visited[k]=TRUE;

q->data[q->rear]=k;

q->rear=(q->rear+1)%N;while (q->rear!=q->front) /*当队列不为空,进行搜索*/{

i=q->data[q->front];

q->front=(q->front+1)%N;for (j=0;jvexnum;j++)if ((g->arcs[i][j]==1)&&(!visited[j]))

{

printf("%c",g->vexs[j]);

visited[j]=TRUE;

q->data[q->rear] = j; /*(5)---刚访问过的结点入队*/q->rear = (q->rear + 1) % N; /*(6)---修改队尾指针*/}

}

}/*bfs*/

/*广度优先搜索整个图*/

void tbfs(graph *g)

{inti;

printf("\n从顶点%C开始广度优先搜索序列:",g->vexs[0]);for (i=0;ivexnum;i++)if (visited[i]!=TRUE)

bfs(i,g);/*从顶点i开始广度优先搜索*/printf("\n");

}/*tbfs*/

void init_visit() /*初始化访问标识数组*/{inti;for (i=0;i

visited[i]=FALSE;

}intmain()

{

graph ga;inti,j;

printf("***********图邻接矩阵存储和图的遍历***********\n");

printf("\n1-输入图的基本信息:\n");

createGraph(&ga);

printf("\n2-无向图的邻接矩阵:\n");for (i=0;i

{for (j=0;j

printf("%3d",ga.arcs[i][j]);

printf("\n");

}

printf("\n3-图的遍历:\n");

init_visit();/*初始化访问数组*/tdfs(&ga); /*深度优先搜索图*/init_visit();

tbfs(&ga); /*广度优先搜索图*/

return 0;

}

运行结果(输入的为本节中一直用到的无向图)

深度和广度查找不同之处在于对顶点的访问顺序不同。

第一次写博客,应该还是有点问题的(虽然也查了一些资料~.~)

ball ball you can point my errors! thanks a  lot !

参考资料:

《数据结构(C语言版)》  严蔚敏 李冬梅 吴伟民著 人民邮电出版社

《程序设计中实用的数据结构 》  王建德 吴永辉著  人民邮电出版社

数据结构深度优先搜索c语言,C语言数据结构与算法之深度、广度优先搜索相关推荐

  1. 数据结构(廿五) -- C语言版 -- 图 - 图的遍历 -- 邻接矩阵 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.概 述 二.深度优先遍历(DFS) 2.1.无向图的遍历过程 2.2.有向图的遍历过程 2.3.总结说明 2.4.实现源代码 三.广度优先遍历(BFS) 3.1.广度优先的 ...

  2. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

  3. 算法复习|广度优先搜索BFS

    广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...

  4. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  5. 深度优先搜索和广度优先搜索C语言 (紫皮书)

    源代码在文章最后! 深度优先搜索 深度优先搜索又叫depth first search,是一种在开发爬虫早期比较常用的方法,这里我会用最易懂的方法让大家理解深度优先搜索**,所谓深度优先搜索,就是找到 ...

  6. 数据结构无向图的操作(C语言)

    目录 //1.含邻接矩阵的图结构 //2.创建邻接矩阵 //3.打印邻接矩阵 //4.邻接表的图结构 //5.创建邻接表 //6.打印邻接表 //7.深度优先搜索 //8.广度优先搜索 //9.带主函 ...

  7. 广度优先搜索递归C语言代码,C++实现广度优先搜索实例

    本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用.具体如下: 首先,图的遍历是指从图中的某一个顶点出发,按照某 ...

  8. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方.这里拿一起讨论,方便比较. 先给大家说一下两者大概的区别: 如果搜索是以接近起始状态的程序依次扩展状态的, ...

  9. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  10. 广度优先搜索与深度优先搜索

    广度优先搜索(宽度优先搜索,BFS)和深度优先搜索(DFS)算法的应用非常广泛,本篇文章主要介绍BFS与DFS的原理.实现和应用. 深度优先搜索 图的深度优先搜索(Depth First Search ...

最新文章

  1. Nat. Mach. Intell. | 探索稀疏化学空间的化学语言模型新策略
  2. iis 发布MVC HTTP错误 403.14
  3. windows server 2003 IIS6.0部署PHP
  4. python 找不到ssl模块问题 no module named _ssl
  5. 《用户故事与敏捷方法》阅读笔记一
  6. shell连接工具_无需本地软件,只用浏览器就能连接并控制安卓手机
  7. 5W+人的公司怎么把总部和分部网络连接起来?
  8. Hibernate里自定义UserType时取不到值的问题
  9. jquery 判断数据是否重复
  10. Radware:安全信息的传送可以加速网络攻击的防御
  11. JSON数据格式以及与后台交互数据转换实例
  12. 【报告分享】2020中国数字化后浪:中小企业转型与创新实录.pdf(附下载链接)...
  13. 网络嵌入之STNE model
  14. 5 月编程语言排行榜:Java第一,R 跌出Top20,Python成最大赢家
  15. 初涉SEO有感-房途网SEO
  16. 网页中透明Flash的设置
  17. iPhone如何恢复出厂设置?苹果手机恢复出厂设置教程【3种方法】
  18. 科研为什么需要甘特图
  19. java 设置 cors,Spring MVC配置CORS
  20. [Linux][问题解决]Linux访问本地网站可以,但是外部访问不行

热门文章

  1. 品达物流TMS项目_第12章 项目总结
  2. window对象方法
  3. PS更改GIf图片大小
  4. 删除三星内置输入法后千万不要加密设备
  5. vantUi密码框密码显示与隐藏(密文/明文)
  6. 日学壹技:json.load() vs json.loads()
  7. macOS搭建嵌入式开发环境总结
  8. 升级版的工厂模式(外联配置文件+内用反射),体现多态好处(^-^) 【java基础-----多态好处】
  9. linux部署Minio(分布式文件服务器)
  10. 这10款App安全测试工具应该能帮到你很多