图的广度优先搜索(BFS)

把以前写过的图的广度优先搜索分享给大家(C语言版)

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef int QElemType;

typedef struct ArcNode//边结点
{
    int adjvex;
    struct ArcNode *nextarc;
}ArcNode;

typedef struct VNode//定义头数组
{
    VertexType data;
    ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct ALGraph//定义图
{
    AdjList vertices;
    int vernum,arcnum;
}ALGraph;

typedef struct SqQueue
{
    QElemType *base;
    int front;
    int rear;
}SqQueue;

int CreateDG(ALGraph &G)
{
    int i,j,k,v1,v2;
    ArcNode *p;
    printf("请输入图的节点数:");
    scanf("%d",&G.vernum );
    printf("请输入图的边的个数:");
    scanf("%d",&G.arcnum);
    for(i=0;i<G.vernum;i++)
    {
        printf("请输入第%d个顶点数据:",i+1);
        getchar();
        scanf("%c",&G.vertices[i].data);
        //G.vertices[i].data=i;
        G.vertices[i].firstarc=NULL;
    }
    printf("请输入节点的边关系,如:结点1和结点2有边就输入1和2(每条边就输入一次):\n");
    for(k=0;k<G.arcnum;k++)
    {
        printf("请输入第%d条边的一个结点:",k+1);
        scanf("%d",&v1);
        printf("请输入第%d条边的另一个结点:",k+1);
        scanf("%d",&v2);
        printf("\n");
        i=v1;
        j=v2;
        while(i<1||i>G.vernum||j<1||j>G.vernum)
        {
            printf("请输入第%d条边的一个结点:",k+1);
            scanf("%d",&v1);
            printf("请输入第%d条边的一个结点:",k+1);
            scanf("%d",&v2);
            printf("\n");
            i=v1;
            j=v2;
        }
        p=(ArcNode *)malloc(sizeof(ArcNode));
        if(!p)
        {
            printf("分配内存失败!\n");
            return 0;
        }
        p->adjvex=j-1;
        p->nextarc=G.vertices[i-1].firstarc;
        G.vertices[i-1].firstarc=p;
    }
    return OK;
}
int InitQueue(SqQueue &Q)
{
    Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
    if(!Q.base)
    {
        printf("队列内存失败!\n");
        return 0;
    }
    Q.front=Q.rear=0;
    return (OK);
}

int EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%MAXQSIZE==Q.front)
    {
        printf("队列已满!\n");
        return 0;
    }
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXQSIZE;
    return (OK);
}
int QueueEmpty(SqQueue Q)
{
    if(Q.front==Q.rear)
        return (OK);
    else
        return 0;
}

int DeQueue(SqQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)
    {
        printf("队列为空!无法删除!\n");
        return 0;
    }
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAXQSIZE;
    return (e);
}
void BFSTraverse(ALGraph G)
{
    int i,j,k;
    int visited[MAX_VERTEX_NUM];
    ArcNode *p;
    SqQueue Q;
    for(i=0;i<G.vernum;i++)
        visited[i]=0;
    InitQueue(Q);
    for(i=0;i<G.vernum;i++)
    {
        if(visited[i]==0)
        {
            visited[i]=1;
            printf("%c-->",G.vertices[i].data);
            EnQueue(Q,i);
            while(!QueueEmpty(Q))
            {
                DeQueue(Q,j);
                for(k=j,p=G.vertices[j].firstarc;p!=NULL;k=p->adjvex,p=p->nextarc)
                {
                    if(visited[k]==0)
                    {
                        visited[k]=1;
                        printf("%c-->",G.vertices[k].data);
                        EnQueue(Q,k);
                    }
                }
            }
        }
    }
}
int main()
{
    ALGraph G;
    CreateDG(G);

    printf("广度优先搜索结果为\n开始-->");
    BFSTraverse(G);
    printf("结束!\n");
    return 0;
}

运行结果截图:

时间: 2024-09-16 16:07:24

图的广度优先搜索(BFS)的相关文章

【算法导论】图的广度优先搜索遍历(BFS)

       图的存储方法:邻接矩阵.邻接表        例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表:         邻接表存储方法是一种顺序存储与链式存储相结合的存储方法.在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间.         邻接表存储结构由两部分组成:对于每个顶点vi, 使用一个具有两个域的结构体数组来存储,这个数组称为顶

c++-图的广度优先搜索问题,我的代码超出时间限制求修改或给出新的答案,谢谢!

问题描述 图的广度优先搜索问题,我的代码超出时间限制求修改或给出新的答案,谢谢! Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上按编号递增的顺序排列.邻接矩阵中元素值为1,表示对应顶点间有一条边,元素值为0,表示对应顶点间没有边),输出从该顶点开始进行广度优先搜索(Breadth-First Search, BFS)的顶点访问序列.假设顶点数目<=100,并且,对于同一顶点的多个邻接顶点,按照顶点编号从小到大的顺序进行搜

基于图的深度优先搜索和广度优先搜索java实现

 为了解15puzzle问题,了解了一下深度优先搜索和广度优先搜索.先来讨论一下深度优先搜索(DFS),深度优先的目的就是优先搜索距离起始顶点最远的那些路径,而广度优先搜索则是先搜索距离起始顶点最近的那些路径.我想着深度优先搜索和回溯有什么区别呢?百度一下,说回溯是深搜的一种,区别在于回溯不保留搜索树.那么广度优先搜索(BFS)呢?它有哪些应用呢?答:最短路径,分酒问题,八数码问题等.言归正传,这里笔者用java简单实现了一下广搜和深搜.其中深搜是用图+栈实现的,广搜使用图+队列实现的,代码如下

图的广度优先遍历算法

前言 广度优先遍历算法是图的另一种基本遍历算法,其基本思想是尽最大程度辐射能够覆盖的节点,并对其进行访问.以迷宫为例,深度优先搜索更像是一个人在走迷宫,遇到没有走过就标记,遇到走过就退一步重新走:而广度优先搜索则可以想象成一组人一起朝不同的方向走迷宫,当出现新的未走过的路的时候,可以理解成一个人有分身术,继续从不同的方向走,,当相遇的时候则是合二为一(好吧,有点扯了). 广度优先遍历算法的遍历过程 仍然以上一篇图的深度优先遍历算法的例子进行说明,下面是广度优先遍历的具体过程: 从起点0开始遍历

【算法入门】广度/宽度优先搜索(BFS)

广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名.  一般可以用它做什么呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的. 算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好. 2.图

C++实现广度优先搜索实例_C 语言

本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用.具体如下: 首先,图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次.注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历.图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search). 一.广度优先搜索(BFS)的

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之:反之,退回到最近访问过的顶点:直到与起始顶点相通的全部顶点都访问完毕: 3.若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2: 反之,遍历结束.  连通图的深度优先遍历类似于树的先根遍历 如何判别V的邻接点是否被访问? 解决办法:为每个顶点设立一个"访问标志

python 广度优先搜索 遍历图中的点

问题描述 python 广度优先搜索 遍历图中的点 mapmodel=[ [0,1,1,-1,1], [1,0,-1,1,-1], [1,-1,0,-1,1], [-1,1,-1,0,-1], [1,-1,1,-1,0] ] flag=[1,0,0,0,0] def dfs(current,sumpoint): if sumpoint==5: print sumpoint,flag for i in range(5): if mapmodel[current][i]==1 and flag[i]