ALDS1_11_C:Breadth First Search


题目链接: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(就是队列为空后,仍然没有访问过的节点)

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/80602621