广度优先搜索算法—BFS

来源:互联网 发布:js清除history 编辑:程序博客网 时间:2024/05/22 06:51

广度优先搜索算法—BFS

图的广度优先搜索遍历类似于树的按层次遍历,其基本思想是从图中的某个顶点V0出发,在访问此顶点之后依次访问V0的所有未被访问的临接点,之后按这些邻接点被访问的先后顺序依次访问到它们的邻接点,直到图中所有和V0有路径相通的顶点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为新的出发点,重复此过程,直至图中所有顶点都被访问到。

邻接表的建立过程可参考(http://blog.csdn.net/dear_mr/article/details/70551094),这里就不重复描述了。

BFS算法:

void BFS(Graph graph, int begin) {    int value, i;    printf("%c ", graph[begin].data);    visited[begin] = 1;    CSeQueue *cs = NULL;    initSeQueue(&cs);    inSeQueue(cs, begin);    while(isEmpty(cs)) {        value = outSeQueue(cs);        for(i = firstVertex(graph, value); i >= 0; i = nextVertex(graph, value, i)) {            if(!visited[i]) {                printf("%c ", graph[i].data);                visited[i] = 1;                inSeQueue(cs, i);            }        }    }    destorySeQueue(&cs);}
void BFSTravel(Graph graph, int begin) {    int i;    BFS(graph, begin);    for(i = 0; i < Num; i++) {        if(!visited[i]) {            BFS(graph, i);        }    }}

关于firstVertex、nextVertex这两个函数,可参考(http://blog.csdn.net/dear_mr/article/details/70551094)

循环队列的代码:

#ifndef _CSEQUEUE_H_#define _CSEQUEUE_H_#include<stdio.h>#include<malloc.h> #define MAXSIZE 100#define TRUE  1#define FALSE 0typedef int boolean;typedef int dataType;typedef struct CSeQueue {    dataType data[MAXSIZE];    int front, rear;}CSeQueue; void initSeQueue(CSeQueue **cs);boolean inSeQueue(CSeQueue *cs, dataType data);dataType outSeQueue(CSeQueue *cs);void destorySeQueue(CSeQueue **cs);boolean isEmpty(CSeQueue *cs);boolean isFull(CSeQueue *cs);boolean isFull(CSeQueue *cs) {    return (cs->rear + 1) % MAXSIZE == cs->front ? TRUE : FALSE;    } boolean isEmpty(CSeQueue *cs) {    return cs->front == cs->rear ? TRUE : FALSE;}void destorySeQueue(CSeQueue **cs) {    if(*cs == NULL) {        return;    }    free(*cs);}dataType outSeQueue(CSeQueue *cs) {    if(cs->front == cs->rear) {        printf("队列为空.\n");        return FALSE;    }    cs->front = (cs->front + 1) % MAXSIZE;    return cs->data[cs->front];}boolean inSeQueue(CSeQueue *cs, dataType data) {    if((cs->rear + 1) % MAXSIZE == cs->front) {        printf("队列已满.\n");        return FALSE;    }    cs->rear = (cs->rear + 1) % MAXSIZE;    cs->data[cs->rear] = data;}void initSeQueue(CSeQueue **cs) {    if(*cs != NULL) {        printf("队列已经初始化过了.\n");        return;    }    (*cs) = (CSeQueue*)malloc(sizeof(CSeQueue));    (*cs)->front = (*cs)->rear = MAXSIZE-1;  //将 front, rear的值改为第一个单元的直接前驱的下标 }#endif

下载地址: http://download.csdn.net/detail/dear_mr/9824116

0 0
原创粉丝点击