这道题是广度优先搜索 区别一下广度优先和深度优先
1、深度优先算法
遍历规则:不断地沿着顶点的深度方向遍历。顶点的深度方向是指它的邻接点方向。 最后得出的结果为:ABDECFHG。
2、广度优先算法:
遍历规则: 1)先访问完当前顶点的所有邻接点。(应该看得出广度的意思) 2)先访问顶点的邻接点先于后访问顶点的邻接点被访问。
最后得出的结果为:ABCDEFGH。
深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。
广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。
找到一篇写的很通俗易懂的博客,给大家分享一下
广度优先搜索算法
#include <stdio.h>
#include <stdlib.h>
#define max 20
int visited[max];
typedef struct ArcNode
{
int adjvex;//邻接点域
struct ArcNode* nextarc;//链域
}ArcNode;//边表
typedef struct VertexNode
{
int data;//顶点数据
ArcNode* firstarc;//指向该顶点第一条弧的指针
}VertexNode;//表头节点表
typedef struct AdjList
{
VertexNode vertex[max];//顶点
int num_ver;//顶点数,
int num_arc;//弧数
}AdjList;//图
typedef struct {
int data[max];
int front;//队首
int last; //队尾
int len; //队长
}Queue;//队列
//找到顶点对应位置
int Locate(AdjList A, int v)
{
for (int i = 0; i < A.num_ver; i++) {
if (A.vertex[i].data == v) {
return i;
}
}
return -1;
}
//创建图
void CreateList(AdjList* A, int n, int m)
{
if (A == NULL) {
return;
}
A->num_ver = n;//顶点数
A->num_arc = m;//弧数
for (int i = 0; i < A->num_ver; i++) {
scanf("%d", &A->vertex[i].data);
A->vertex[i].firstarc = NULL;
}
int tmp1, tmp2, loc;
for (int i = 0; i < A->num_arc; i++) {
scanf("%d%d", &tmp1, &tmp2);//顶点元素与它的邻接点
ArcNode* tmp;
tmp = (ArcNode*)malloc(sizeof(ArcNode));
if (tmp == NULL) {
return;
}
tmp->adjvex = tmp2;
loc = Locate(*A, tmp1);
tmp->nextarc = A->vertex[loc].firstarc;
A->vertex[loc].firstarc = tmp;
}
}
//初始化队列
void InitQueue(Queue* q)
{
q->front = 0;
q->last = -1;
q->len = 0;
}
//入队
void EnterQueue(Queue* q,int m)
{
if(q->len > max) return;
q->last=(q->last+1)%max;
q->data[q->last]=m;
q->len++;
}
//出队
void DeleteQueue(Queue *q,int *temp)
{
if(q->len==0) return;
*temp=q->data[q->front];
q->front=(q->front+1)%max;
q->len--;
}
//广度优先搜索
int BFS(AdjList A, int loc1,int loc2)
{
Queue *q;//队列
q=(Queue*)malloc(sizeof(Queue));
InitQueue(q);
visited[loc1]=1;//第一个已访问
EnterQueue(q,loc1);//入队,准备检查
if(loc1==loc2)
{
return 1;
}
int del,loc;
while(q->len!=0)
{
DeleteQueue(q,&del);//保留出队元素,用于比较
ArcNode *temp;
temp=A.vertex[del].firstarc;//看看出队的该元素是否与loc2相连接
while(temp!=NULL)
{
loc=Locate(A,temp->adjvex);
if(visited[loc]!=1)
{
if(loc==loc2) return 1;//未被访问并且相等 说明找到了
}
visited[loc]=1;//否则标记,防止死循环
EnterQueue(q,loc);//把它的所有有关系的元素入队,等待检查
temp=temp->nextarc;
}
}
return 0;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
AdjList A;
CreateList(&A,n,m);
int v1,v2;
scanf("%d %d",&v1,&v2);
if(BFS(A,Locate(A,v1),Locate(A,v2)))
{
printf("yes");
}
else
printf("no");
return 0;
}