广度优先搜索算法—BFS

版权声明:Dear_Mr原创文章,未经允许,不得转载 https://blog.csdn.net/Dear_Mr/article/details/70650751

广度优先搜索算法—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 0

typedef 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

展开阅读全文

没有更多推荐了,返回首页