广度优先搜索以“广度”为关键词
每次以扩散的方式向外访问顶点
和树的遍历一样需要使用一个队列
通过反复取出队首顶点
将该顶点可到达的未曾加入过队列的队列全部入队
直到队列为空时遍历结束
【基本思想】
建立一个队列
并把初始顶点加入队列
此后每次取出队首顶点进行访问
并把从该顶点出发可以到达的未曾加入过队列(而不是访问)的顶点全部加入队列
直到队列为空
//邻接矩阵版
int n,G[MAXV][MAXV];
bool inq[MAXV]={false};
void BFS(int u)
{
queue<int> q;
q.push(u);
inq[u]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=0;v<n;v++)
{
if(inq[v]==false&&G[u][v]!=INF)
{
q.push(v);
inq[v]=true;
}
}
}
}
void BFSTrave()
{
for(int u=0;u<n;u++)
{
if(inq[u]==false)
BFS(q);
}
}
//邻接表版
vector<int>Adj[MAXV];
int n;
bool inq[MAXV]={false};
void BFS(int u)
{
queue<int> q;
q.push(u);
inq[u]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<Adj[u].size();i++)
{
int v=Adj[u][i];
if(inq[v]==false)
{
q.push(v);
inq[v]=true;
}
}
}
}
与树的BFS遍历一样
在给定BFS初始点的情况下
可能需要输出该连通块内所有其他顶点的层号
这时只需要修改少量内容即可达到要求
首先,由于需要存放顶点层号
要先定义结构体
struct Node{
int v;
int layer;
};
vector<Node>Adj[N];