题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_11_C
邻接表的方式给出一个图,对这个图进行bfs最终求出每个节点到顶点1的距离;
思路:先把图转成邻接矩阵;
如果我想对一个邻接矩阵的图,做宽度优先搜索。
首先把第一个节点1,放进Q队列;
第一步取队列的第一个元素,把它pop出来,比如说是u节点,然后遍历所有节点,如果有能到的,而且没搜过的节点,就把这个节点push进队列,同时,这个点的距离就等于u到1节点的距离+1,每一次遍历,所有节点到顶点1的距离都+1了;直到图遍历完了,就是所有节点的距离都算完了,就结束bfs。
具体代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
bool A[110][110],flag[110];
int d[110];
int n;
void bfs(){
queue<int> Q;
Q.push(1);
d[1]=0;
while(Q.empty()==0){
int u=Q.front();
Q.pop();
for(int i=2;i<=n;i++){
if(A[u][i]==true && flag[i]==false ){
flag[i]=true;
Q.push(i);
d[i]=d[u]+1;
}
}
}
for(int i=2;i<=n;i++) if(flag[i]==false) d[i]=-1;
return ;
}
int main(){
int a,b,c;
cin>>n;
for(int i=1;i<=n;i++){
flag[i]=false;
for(int j=1;j<=n;j++){
A[i][j]=false;
}
}
for(int i=1;i<=n;i++){
cin>>a>>b;
for(int j=1;j<=b;j++){
cin>>c;
A[a][c]=true;
}
}
bfs();
for(int i=1;i<=n;i++) cout<<i<<" "<<d[i]<<endl;
return 0;
}
错点:
1.pop操作在取出第一个元素的时候就要完成了。
2.要考虑到有的元素无法到达顶点1,所以最后要遍历一次,把到不了的节点赋为-1(就是队列为空后,仍然没有访问过的节点)