1.访问初始节点,并标记已访问
2.入队
3.非空则继续执行
4.出队得头结点
5.查找其邻接点
6.若无右兄弟,跳回3,否则若未访问入队,查找下一个邻接点,转6
代码如下:
#include <stdio.h>
#include <stdlib.h>
int visited[105];
typedef struct edge
{
int adjvex;
struct edge *next;
} edge;
typedef struct vertexnode
{
int data;
edge *firstedge;
} vnode, adjlist[105];
typedef struct graph
{
int vm, em;
adjlist a;
} LGraph;
LGraph *creategraph()
{
int i;
int em, vm;
LGraph *G = (LGraph *)malloc(sizeof(LGraph));
scanf("%d %d\n", &vm, &em);
G->em = em;
G->vm = vm;
for (i = 1; i <= vm; i++)
{
int temp;
scanf("%d", &temp);
G->a[temp].data = temp;
G->a[temp].firstedge = NULL;
visited[temp] = 0;
}
for (i = 1; i <= em; i++)
{
int v1, v2;
scanf("%d %d\n", &v1, &v2);
edge *e = (edge *)malloc(sizeof(edge));
e->adjvex = v2;
e->next = G->a[v1].firstedge;
G->a[v1].firstedge = e;
}
return G;
}
typedef struct queue
{
int q[105];
int front, rear;
} queue;
queue *createqueue()
{
queue *Q;
Q = (queue *)malloc(sizeof(queue));
Q->front = 0;
Q->rear = 0;
return Q;
}
void enqueue(queue *paqu, int x)
{
paqu->q[paqu->rear] = x;
paqu->rear = ((paqu->rear) + 1) % 105;
}
int dequeue(queue *paqu)
{
int a=paqu->q[paqu->front];
paqu->front = ((paqu->front) + 1) % 105;
return a;
}
int isempty(queue *paqu)
{
return (paqu->front == paqu->rear);
}
int FLAG = 0;
void BFS(LGraph *G, int v1, int v2)
{
edge *p;
queue *Q;
Q = createqueue();
enqueue(Q, v1);//检索开始之处
while (!isempty(Q))//直到队列为空
{
int temp=dequeue(Q);//队头出队,返回该被弹出对队头的下标
p = G->a[temp].firstedge;//定位到该顶点的的顶点指针
visited[temp] = 1; //标志已访问过
while (p != NULL)//直到遍历完它所有的右兄弟
{
if (v2 == p->adjvex)//如果找到路径
FLAG = 1;
if (visited[p->adjvex] != 1)//如果没有被访问则入队
{
enqueue(Q, p->adjvex);
}
p = p->next;//走向下一个右兄弟
}
//该点以及其所有右兄弟都已入队,该点才能弹出并被标记已访问
}
}
int main()
{
LGraph *G;
G = creategraph();
int v1, v2;
scanf("%d %d", &v1, &v2);
BFS(G, v1, v2);
if (v1 == v2)
FLAG = 1;
if (FLAG == 1)
printf("yes");
else
printf("no");
return 0;
}