图的BFS遍历

点击查看代码
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#pragma warning(disable:4996)
const int maxn = 1010; //最多1000个顶点
const int INF = 1000000; //无穷大,表示两个顶点之间不相连

//1、图的BFS遍历(使用邻接表存储图)
vector<int> Adj[maxn]; //邻接表Adj[],Adj[i]存储所有与顶点i相连的顶点编号
int n; //顶点数
bool inq[maxn] = { false }; //记录顶点是否已入过队(in queue),inq[i]=true表示顶点i已入过队

//使用BFS遍历顶点u所在的连通块
void BFS(int u) { 
	queue<int> q; //定义队列q
	q.push(u); //顶点u入队
	inq[u] = true; //设置顶点u已入过队
	while (!q.empty()) { //只要队列q非空,就继续遍历
		int u = q.front(); //取出队首元素存入变量u中
		q.pop(); //队首元素出队后要手动删除

		/* 编写与顶点u有关的操作,如输出u */

		for (int i = 0; i < Adj[u].size(); i++) { //枚举u的所有邻接点
			int v = Adj[u][i]; //为了方便书写,将邻接点Adj[u][i]存入变量v中	
			if (inq[v] == false) { //如果邻接点v没有入过队
				q.push(v); //则邻接点v入队
				inq[v] = true; //设置v已入过队
			}
		}
	}
}

//使用BFS遍历图G的所有连通块
void BFSTrave() { 
	for (int u = 0; u < n; u++) { //枚举所有顶点
		if (inq[u] == false) { //顶点u未入过队
			BFS(u); //使用BFS遍历顶点u所在的连通块
		}
	}
}

//2、图的BFS遍历(使用邻接矩阵存储图)
int n, G[maxn][maxn]; //顶点数,邻接矩阵G
bool inq[maxn] = { false }; //记录顶点是否已入过队(in queue),inq[i]=true表示顶点i已入过队

//使用BFS遍历顶点u所在的连通块
void BFS(int u) { 
	queue<int> q; //定义队列q
	q.push(u); //顶点u入队
	inq[u] = true; //设置顶点u已入过队
	while (!q.empty()) { //只要队列q非空,就继续遍历
		int u = q.front(); //取出队首元素存入变量u中
		q.pop(); //队首元素出队后要手动删除

		/* 编写与顶点u有关的操作,如输出u */

		for (int v = 0; v < n; v++) { //枚举u的所有邻接点
			//如果u的邻接点v没有入过队,且u和v之间相连(不是无穷大)
			if (inq[v] == false && G[u][v] != INF) {
				q.push(v); //则邻接点v入队
				inq[v] = true; //设置v已入过队
			}
		}
	}
}

//使用BFS遍历图G的所有连通块
void BFSTrave() { 
	for (int u = 0; u < n; u++) { //枚举所有顶点
		if (inq[u] == false) { //顶点u未入过队
			BFS(u); //遍历顶点u所在的连通块
		}
	}
} 		

//3、输出每个连通块内所有其他顶点的层号,如果当前顶点层号是L,则它所有出边的终点层号都是L+1
struct Node {
	int v; //顶点编号
	int layer; //顶点层号
};
vector<Node> Adj[maxn]; //邻接表,注意存储的是Node型元素
int n; //顶点数
bool inq[maxn] = { false }; //记录顶点是否已入过队(in queue),inq[i]=true表示顶点i已入过队

void BFS(int s) { //s是起点编号
	queue<Node> q; //定义队列q
	Node start; //定义变量起点start
	start.v = s; //起点编号为s
	start.layer = 0; //起点层号为0
	q.push(start); //将起点start入队
	inq[start.v] = true; //设置顶点start.v已入过队
	while (!q.empty()) { //只要队列q非空,就继续遍历
		Node topNode = q.front(); //取出队首顶点存入变量topNode中
		q.pop(); //队首元素出队后要手动删除
		int u = topNode.v; //队首顶点编号存入变量u中

		/* 编写与顶点u有关的操作,如输出u */

		for (int i = 0; i < Adj[u].size(); i++) { //枚举u的所有邻接点
			Node next = Adj[u][i]; //为了方便书写,将邻接点Adj[u][i]存入变量next中
			next.layer = topNode.layer + 1; //邻接点next的层号为当前顶点topNode的层号加一			
			if (inq[next.v] == false) {	//如果邻接点next的没入过队
				q.push(next); //则将邻接点next入队
				inq[next.v] = true; //设置顶点next.v已入过队
			}
		}
	}
}

//使用BFS遍历图G的所有连通块
void BFSTrave() { 
	for (int u = 0; u < n; u++) { //枚举所有顶点
		if (inq[u] == false) { //顶点u未入过队
			BFS(u); //使用BFS遍历u所在的连通块
		}
	}
}

posted @ 2022-09-30 21:15  zhaoo_o  阅读(47)  评论(0编辑  收藏  举报