您的位置:首页 > 编程语言 > C语言/C++

关于深度优先搜索和广度优先搜索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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息