图的开始--第二天打卡之图的遍历(bfs)
作者:
lgd123
,
2021-07-26 10:24:15
,
所有人可见
,
阅读 234
/*图的宽度优先搜索
1、宽度优先搜索通过队列来实现。
2、宽度优先搜索是尽可能的搜索与以搜索相邻的未搜索点,所以经常使用bfs来进行最短路径的查找。
3、在宽搜的过程中,会有一个标记数组,来表示是否访问过这个顶点,也会有一个答案数组来记录起点与顶点之间的距离。
4、宽度优先搜索的基本实现步骤:
①、将起点放入队列q
②、只要q不为空,就执行循环处理:
从队列中取出队头a,进行访问。
将与a相邻的未访问点v放入q,同时将标记答案的数组标记为上一个顶点的距离+1;
*/
----------
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 105;
int m[N][N];
int d[N],n;//这里的d[]既是答案数组,也是 标记数组。
void bfs(int s)
{
queue<int> q;
q.push(s);
memset(d,-1,sizeof(d));
d[s]=0;
while(!q.empty())
{
int u;
u = q.front();q.pop();
for(int i=0;i<n;i++)
{
if(m[u][i]==0) continue;
if(d[i]!=-1) continue;
d[i]=d[u]+1;
q.push(i);
}
}
for(int i=0;i<n;i++)
{
if(d[i]==-1) cout<<i+1<<" "<<-1<<endl;
else cout<<i+1<<" "<<d[i]<<endl;
}
}
int main()
{
int u,v,k;
cin>>n;
memset(m,0,sizeof(m));
for(int i=0;i<n;i++)
{
cin>>u>>v;
u--;
for(int j=0;j<v;j++)
{
cin>>k;
k--;
m[u][k]=1;
}
}
bfs(0);
return 0;
}