图的广度优先遍历(bfs)

时间:2023-03-09 04:05:22
图的广度优先遍历(bfs)

广度优先遍历:

1.将起点s 放入队列Q(访问)

2.只要Q不为空,就循环执行下列处理

(1)从Q取出顶点u 进行访问(访问结束)

(2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[u] + 1

主要变量

M[n][n] 邻接矩阵,如果存在顶点i到顶点j 的边,则M[i][j] 为true
Queue Q 记录下一个待访问顶点的队列
d[n]

将起点s 到个顶点i的最短距离记录在d[i]中。

s无法到达i 时d[i] 为INFTY(极大值)

 #include<iostream>
#include<queue>
using namespace std; static const int N = ;
static const int INFTY = ( << ); int n, M[N][N];
int d[N];//用来存储v到起始顶点的距离 void bfs(int s) {
queue <int> q;
q.push(s);//起始顶点 入队
//设置初始值, 通过判断距离大小来明白该顶点是否被访问
for(int i = ; i < n; i++) d[i] = INFTY;
d[s] = ;//初始值为0
int u;
while( !q.empty() ) {
u = q.front();
q.pop();
//检索与该顶点有连接的顶点,并入队
for(int v = ; v < n; v++) {
if(M[u][v] = ) continue;
//如果该顶点被访问过
if(d[v] != INFTY) continue;
//该顶点与起始顶点的距离等于,上一个顶点与起始顶点距离加1
d[v] = d[u] + ;
q.push(v);
}
}
//输出,若未被访问则输出-1
for(int i = ; i < n; i++) {
cout << i + << " " << ( (d[i] == INFTY) ? (-) : d[i] ) << endl;
}
} int main() {
int u, k, v;
cin >> n;
//初始化
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++)
M[i][j] = ;
}
//输入数据构建邻接矩阵
for(int i = ; i < n; i++) {
cin >> u >> k;
u--;
for(int j = ; j < k; j++) {
cin >> v;
v--;
M[u][v] = ;
}
}
//广度优先遍历
bfs(); return ;
} /*
4
1 2 2 4
2 1 4
3 0
4 1 3
*/