图的遍历(广度优先搜索遍历)

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); 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值