1、广度优先搜索遍历过程
(1)从某个顶点V出发,访问该顶点的所有邻接点V1,V2…VN
(2)从邻接点V1,V2…VN出发,再访问他们各自的所有邻接点
(3)重复上述步骤,直到所有的顶点都被访问过
若此时图中还有顶点未被访问,则在外控算法的控制下,另选一个未曾被访问的顶点作为起始点,重复上述过程,直到图中所有顶点都被访问完为止。
2、示例
对图7-28连通无向图广度优先搜索(以v0为出发点):v0,v1,v2,v3,v4,v5,v6,v7,v8
对图7-29非连通无向图广度优先搜索(以v0为出发点):v0,v1,v2,v3,v4,v5,v6,v7,v4为另一个起始点
对图7-30(a)有向图的广度优先搜索(v2为出发点):v2,v1,v3,v0,v4
对图7-30(b)有向图的广度优先搜索(v0为出发点):v0,v1,v4,v3,v2,v2为另一出发点
3、连通图的广度优先搜索遍历算法
- 基本思想:
假设从某顶点v 出发,在访问了v 之后依次访问v 的各个未曾访问过和邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至所有已被访问的顶点的邻接点都被访问到。若此时尚有顶点未被访问,则另选一个未曾被访问的顶点作起始点,重复上述过程,直至所有顶点都被访问到为止。换句话说,广度优先搜索遍历图的过程中以v 为起始点,由近至远,依次访问和v 有路径相通的顶点。 - 算法描述(用邻接矩阵实现)
#include<stdio.h>
#define MaxSize 10
typedef char VertexType;//节点类型
int visited[MaxSize] = {0};//标识该节点是否被访问
/*—————————图的构造———————————*/
typedef struct {
int edgeNum;//边数
int vertexNum;//节点个数
VertexType vertex[MaxSize];//存放点的一维数组
int edge[MaxSize][MaxSize]; //存放边的二维数组
}MGraph;
void init(MGraph *G, VertexType a[], int n, int e);
void DFS(MGraph *G, int v);
/*—————————广度优先遍历——————————*/
void BFS(MGraph *G, int v){
int i, j, Queue[MaxSize];
int front = -1, rear = -1;
printf("%c", G -> vertex[v]);
visited[v] = 1;
Queue[++rear] = v;
while(front != rear)//当对列不为空时
{
j = Queue[++front]; //~~~~~~~~取出队头元素进行遍历其邻接点 ~~~~~~~
for(i = 0; i < G -> vertexNum; i++)
if(G -> edge[j][i] == 1 && visited[i] == 0){
printf("%c", G -> vertex[i]);
visited[i] = 1;
Queue[++rear] = i;//将其放入队列中
}
}
}
/*—————————图的初始化——————————*/
void init(MGraph *G){
int i, j, k, R, C;
printf("输入顶点数和边数\n");
scanf("%d %d", & G -> vertexNum, &G -> edgeNum);
printf("输入顶点信息\n");
for(i = 0; i < G -> vertexNum; i++)
scanf(" %c", & G ->vertex[i]);//输入点的信息前面加个空格
//对存储边的信息数组进行初始化
for(i = 0; i < G -> vertexNum; i++)
for(j = 0; j < G ->vertexNum; j++)
G -> edge[i][j] = 0;
printf("输入边(vi, vj)的上标i,下标j\n");
for(k = 0; k < G -> edgeNum; k++){
scanf("%d %d", &R, &C);
G->edge[R][C] = 1;
G->edge[C][R] = 1;
}
}
int main(){
MGraph MG;
init(&MG);
BFS(&MG, 0);
}