关于深度优先搜索和广度优先搜索C语言的简明实现
2013-08-24 11:23
561 查看
深度优先搜索:从图的某顶点出发,依次访问该顶点的邻接点。 广度优先搜索:类似树的按层次遍历 依次访问某顶点各个未访问的顶点。
以遍历下图为例:
假设从1点开始遍历,深度优先:1能到2,到了2以后就不管1能到的3,5了,就直接以2为起始点,以此类推,知道到达一个点不能再继续往下,则退回到上一个结点,直到所有的点被遍历,举例其中的一个深度优先搜索:1-2-4-5-6-7-8-9-3
而广度优先:1能到2,3,5则先遍历2,3,5,再依次从2,3,5中取出一点,遍历此结点所有的邻结点,知道所有的点被遍历,举例其中的一个广度优先搜索:1-2-3-5-4-6-8-7-9
下面我们用C语言实现它们,将1-9编号为0-8(便于直接用数组a[9][9]表示),a[i][j]=1表示i能到达j,a[i][j]=0表示i不能到达j,(其中0<=i,j<=8),vistied[9]表示某点是否被访问,如visited[3]=0,表示3点未被访问,visited[4]=1表示4点已访问。下面是代码的实现:
#include <stdio.h> #define N 9 int a ={{0,1,1,0,1,0,0,0,0} ,{0,0,0,1,1,0,0,0,0} ,{0,0,0,0,1,1,0,0,0} ,{0,0,0,0,1,0,0,1,0} ,{0,0,0,0,0,1,0,0,0} ,{0,0,0,0,0,0,1,0,1} ,{0,0,0,1,1,0,0,1,0} ,{0,0,0,0,0,0,0,0,0} ,{0,0,0,0,0,0,1,1,0}}; int visited ={0,0,0,0,0,0,0,0,0}; int Q ; void BFS(int G[] , int s) //G[i][j]=1表示i可以到达j,s表示搜索的起始点 { visited[s] = 1; Q[0]=s; int first=-1,last=0,v; while(first!=last) { v=Q[++first]; for (int i=0;i<N;i++) { if (G[v][i]==1) { if(visited[i] == 0) { Q[++last]=i; visited[i] = 1; } } } } } static int last=-1; void DFS(int G[] , int s) { visited[s] = 1; Q[++last]=s; for (int i=0;i<N;i++) { if (G[s][i]==1) { if(visited[i] == 0) DFS(G,i); } } } int main() { // BFS(a,0); // for (int i=0;i<N;i++) // printf("%d ",Q[i]); // printf("\n"); DFS(a,0); for (int i=0;i<N;i++) printf("%d ",Q[i]); printf("\n"); return 0; }
相关文章推荐
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
- 图论 深度优先搜索 广度优先搜索的非递归实现
- 深度优先搜索、广度优先搜索的实现
- 【经典算法】:图的深度优先搜索与广度优先搜索的实现
- java实现图的深度优先搜索和广度优先搜索
- 广度优先搜索的c语言实现
- 基于图的深度优先搜索和广度优先搜索java实现
- 图的分支生成:对稀疏的无向图,在度数不等于2的节点处,将图“拆散”,输出各条分支,分别用深度优先搜索和广度优先搜索实现。
- Java编程实现基于图的深度优先搜索和广度优先搜索完整代码
- python实现图的深度优先搜索和广度优先搜索
- 深度优先搜索DFS-C语言实现、思路/解析-简笔
- 图基本算法介绍:广度优先搜索、深度优先搜索、拓扑排序、最强连通分支(概念篇)
- 深度优先搜索和广度优先搜索的深入讨论
- (算法入门)基本图论-广度优先搜索之JAVA实现
- 广度优先搜索和深度优先搜索
- C语言实现图的遍历之深度优先搜索实例
- 关于广度优先搜索的理解
- 经典搜索算实现之一,广度优先.
- 重学数据结构系列之——图的遍历(广度优先搜索和深度优先搜索)
- 深度优先搜索与广度优先搜索 .