广度优先搜索 (BFS)

  广度优先搜索就像排山倒海,或者说像是往水中投一块石头,水波从中心点向四周蔓延开来。BFS常用于最短路径的查找,既然是一层层进行遍历,那么最先到达目标点所在的路径就是最短路径。

  下面来看有向图的广度优先搜索算法的实例,某有向图如下:

#include <stdio.h>

// 邻接矩阵 
typedef struct {
    char vexs[20];  // 顶点存储数据 
    int matrix[20][20];  // 邻接矩阵
    int vexNum, arcNum;  // 顶点数  弧数 
} MatrixGraph;

int visited[20];  // 是否被访问过 

// 广度优先搜索用到了队列 
typedef struct {
    int data[20];
    int front, rear;
} Queue;
void InitQueue(Queue &q) {
    q.front = 0;
    q.rear = 0;
}
void EnQueue(Queue &q, int e) {
    if((q.rear+1) % 20 == q.front) {
        return ;
    }
    q.data[q.rear] = e;
    q.rear = (q.rear+1) % 20;
}
void DeQueue(Queue &q, int &e) {
    if(q.front == q.rear) {
        return ;
    }
    e = q.data[q.front];
    q.front = (q.front+1) % 20;
}
int QueueEmpty(Queue &q) {
    if(q.front == q.rear) {
        return 1;
    }
    return 0;
}

void BFS_DG(MatrixGraph &graph);

/**input:
6 8
abcdef
0 1
0 2
1 2
2 5
5 4
5 3
3 4
1 3
*/
int main() {
    MatrixGraph graph;
    
    // 图的顶点数和弧数 
    scanf("%d%d", &graph.vexNum, &graph.arcNum); 
    getchar();
    // 图的顶点所存储数据 
    for(int i=0; i<graph.vexNum; i++) {
        scanf("%c", &graph.vexs[i]);
    }
    // 邻接矩阵初始化(置无限大) 
    for(int i=0; i<graph.vexNum; i++) {
        for(int j=0; j<graph.vexNum; j++) {
            graph.matrix[i][j] = 0x7fffffff;
        }
    }
    
    for(int i=0; i<graph.arcNum; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        // 有向图 
        graph.matrix[a][b] = 1;
    }
    
    BFS_DG(graph);
}

void BFS_DG(MatrixGraph &graph) {
    Queue queue;
    InitQueue(queue);
    
    for(int i=0; i<graph.vexNum; i++) {
        visited[i] = 0;
    }
    
    printf("广度优先查找结果:\n");
    for(int i=0; i<graph.vexNum; i++) {
        if(!visited[i]) {
            visited[i] = 1;
            printf("%c ", graph.vexs[i]);
            EnQueue(queue, i);
            
            while(!QueueEmpty(queue)) {
                DeQueue(queue, i);
                for(int j=0; j<graph.vexNum; j++) {
                    if(!visited[j] && graph.matrix[i][j]!=0x7fffffff) {
                        visited[j] = 1;
                        printf("%c ", graph.vexs[j]);
                        EnQueue(queue, j);
                    }
                }
            }
        }
    }
}

 

posted @ 2022-04-26 23:39  HanselHuang  阅读(167)  评论(0编辑  收藏  举报