邻接表实现BFS广度优先搜索

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define VERTEX_NUM 8

typedef enum {FALSE = 0, TRUE = 1}BOOL;

typedef struct ArcNode {
    int adjvex;
    struct ArcNode *nextarc;    // struct不能少
}ArcNode;

BOOL visited[VERTEX_NUM + 1];    // 访问标志数组(备忘表)

int FirstAdjVex(ArcNode *G[VERTEX_NUM + 1], int v)
{
    if (G[v] == NULL)            // v是孤立顶点
        return -1;
    return G[v]->adjvex;
}

int NextAdjVex(ArcNode *G[VERTEX_NUM + 1], int v, int w)
{
    ArcNode *p = NULL;
    for (p = G[v]; p != NULL; p = p->nextarc) {
        if (p->adjvex == w) {                // 找到w,将返回
            if (p->nextarc == NULL)            // w已是v的最后一个邻接点
                return -1;
            return p->nextarc->adjvex;
        }
    }
    printf("错误!没找到w\n");
    return -1;
}

typedef struct Queue {
    int arr[VERTEX_NUM + 5];
    int front;
    int tail;
}Queue;

void BFSTraverse(ArcNode *G[VERTEX_NUM + 1])
{
    // 按广度优先非递归遍历图G。使用辅助队列p和访问标志数组visited。
    int v;
    int w;
    int u;
    Queue Q;    // 队列长度为VERTEX_NUM,不会假溢出
    Q.front = 0;
    Q.tail = 0;
    for (v = 1; v <= VERTEX_NUM; ++v)
        visited[v] = FALSE;

    for (v = 1; v <= VERTEX_NUM; ++v) {
        if (!visited[v]) {                        // v尚未访问
            visited[v] = TRUE;
            printf("%d\n", v);
            Q.arr[Q.tail++] = v;                // v入队列
            while (Q.tail != Q.front) {
                u = Q.arr[Q.front++];            // 队头元素出队并置为u
                for (w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w)) {
                    if (!visited[w]) {            // u的尚未访问的邻接顶点w入队列Q
                        visited[w] = TRUE;
                        printf("%d\n", w);
                        Q.arr[Q.tail++] = w;    // w入队列
                    }
                }
            }
        }
    }
}

void CreatAdjListGraph(ArcNode *G[VERTEX_NUM + 1])
{
    int a;
    int b;
    ArcNode *p;
    while (scanf("%d %d", &a, &b), !(a == 0 && b == 0)) {    //以0 0作为输入结束
        p = (ArcNode *)malloc(sizeof(ArcNode));
        if (p == NULL) {
            printf("OVERFLOW!\n");
            exit(-1);
        }
        p->adjvex = b;
        p->nextarc = G[a];    // 头插入
        G[a] = p;

        p = (ArcNode *)malloc(sizeof(ArcNode));
        if (p == NULL) {
            printf("OVERFLOW!\n");
            exit(-1);
        }
        p->adjvex = a;
        p->nextarc = G[b];    // 头插入
        G[b] = p;
    }
}

void Display(ArcNode *G[VERTEX_NUM + 1])
{
    int i;
    ArcNode *p;
    for (i = 1; i <= VERTEX_NUM; i++) {
        printf("%d", i);
        for (p = G[i]; p != NULL; p = p->nextarc) {
            printf("->%d", p->adjvex);
        }
        printf("\n");
    }
}

void Free(ArcNode *G[VERTEX_NUM + 1])
{
    int i;
    ArcNode *p;
    ArcNode *q;
    for (i = 1; i <= VERTEX_NUM; i++) {
        for (p = G[i]; p != NULL;) {
            q = p;
            p = p->nextarc;
            free(q);
            q = NULL;
        }
    }
}

int main(int argc, char **argv)
{
    // 头结点数组设为指针数组
    ArcNode *G[VERTEX_NUM + 1] = {NULL};    // 若这句放到freopen下面则错误,C语言!
    freopen("cin.txt", "r", stdin);

    CreatAdjListGraph(G);    // 建图(邻接表表示)

    Display(G);                // 显示图

    BFSTraverse(G);         // 遍历图

    Free(G);                // 释放图

    return 0;
}

/* cin.txt:
2
4
5
4
5
3
6
7
7
0
*/

运行结果:

时间: 2024-08-29 06:27:51

邻接表实现BFS广度优先搜索的相关文章

图的邻接表表示、广度优先、深度优先搜索

图,就是我们在数据结构中学到的图,它是一种存储信息的结构.图是一类在实际应用中非常常见的数据结构,当数据规模大到一定程度时,如何对其进行高效计算即成为迫切需要解决的问题.最常见的大规模图数据的例子就是互联网网页数据,网页之间通过链接指向形成规模超过500 亿节点的巨型网页图.再如,Facebook 社交网络也是规模巨大的图,仅好友关系已经形成超过10 亿节点.千亿边的巨型图,考虑到Facebook 正在将所有的实体数据节点都构建成网状结构,其最终形成的巨型网络数据规模可以想见其规模.要处理如此规

GraphMatrix::BFS广度优先搜索

查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, int j) //相对于顶点j的下一邻接顶点 { while ((-1 < j) && (!exists(i, --j))); return j; } //逆向线性试探(改用邻接表可提高效率) 对于图中的所有顶点,对每一个连通区域进行BFS: template <typename

图的邻接表+深度优先遍历+广度优先遍历

1 /** 2 无向图的邻接表存储 3 深度优先遍历递归 4 广度优先遍历递归+非递归 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #include <malloc.h> 9 #define N 5 10 #define MAX 50 11 typedef struct A{ 12 int adjvex; 13 struct A* nextArc; 14 }Arc; 15 typedef struct node{

浅谈数据结构之图的邻接表深度和广度优先遍历(九)

邻接矩阵是一种不错的图存储结构,但是我们发现,对于边数相对较少的图,这种结构是存在对存储空间的极大浪费的.我们知道,顺序存储结构存在预先分配内存可能造成空间浪费的问题,于是引出了链式存储的结构.同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题.因此,对于图的存储结构,我们同样引入了一种数组与链表相组合的存储方法,我们一般称之为邻接表. 邻接表的处理方法是这样的:(1).图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易的读取顶点的信息,更加方便:另

步步为营(十六)搜索(二)BFS 广度优先搜索

上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起始状态的长度" 那么广度是什么呢? 个人认为,能够这么归纳: 何为广度? 能够看做"距离初始状态距离相等的结点"的集合 那么BFS的核心思想就是:从初始结点開始,搜索生成第一层结点.检查目标结点是否在这些结点中,若没有,再将全部第一层的结点逐一进行搜索,得到第二层结点,并逐一检查

邻接表的bfs遍历

//输入样例 /* 5 0 AB AD AC CD BE DE */ //输出 /* Please Input the edge x-->y:AB AD AC CD BE DE A 1 2 3 B 0 4 C 0 3 D 0 2 4 E 1 3 */ //dfs测试数据 /* 8 0 Please Input the edge x-->y:AB AC BD BE DH EH HF HG FC GC CA A 1 2 2 B 0 3 4 C 0 0 5 6 D 1 7 E 1 7 F 2 7 G

关于宽搜BFS广度优先搜索的那点事

以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口并选择其他岔路.接下来将介绍的广度优先搜索(Breadth First Search, BFS)则是以广度为第一关键词,当碰到岔道口时,总是先一次访问从该岔道口能直接到达的所有节结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有结点都被访问为止.这就跟平静的水面

BFS - 广度优先搜索 - 邻接列表表示法

2017-07-25 21:40:22 writer:pprp 在DFS的基础上加上了一个BFS函数 #include <iostream> #include <queue> using namespace std; const int N = 9; queue<int> qu; int visited[N] = {0}; //新引入一个数组,用于标记是否访问过 struct node { int vertex; node*next; }; node head[N];

【LeetCode从零单排】No133. clon graph (BFS广度优先搜索)

背景 (以下背景资料转载自:http://www.cnblogs.com/springfor/p/3874591.html?utm_source=tuicool) DFS(Dpeth-first Search)顾名思义,就是深度搜索,一条路走到黑,再选新的路.记得上Algorithm的时候,教授举得例子就是说,DFS很像好奇的小孩,你给这个小孩几个盒子套盒子,好奇的小孩肯定会一个盒子打开后继续再在这个盒子里面搜索.等把这一套盒子都打开完,再打开第二套的.Wikipedia上的讲解是:"Depth