点击查看代码
#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所在的连通块
}
}
}