数据结构noj20图的广搜

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值