关系网络

大家好

//先赞后看,已成习惯

这是一道有关于BFS的题目

广度优先搜索!!!

知识补充——

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。

目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

不足之处多多指教!!!

谢谢给位大佬!!!

代码如下——

#include
#include
#include
using namespace std;
//用一个数组存关系图,还有有个队列   1、编号,2、关系数 
int a[105][105],q[10010][2];
//bool判断有没有走过
bool p[105]; 
int main()
{
	memset(p,true,sizeof(p))//全部定义为true 
	int x,y,n,f,r,tmp;//队首和队尾,tmp临时变量 
	cin>>n>>x>>y;
	//读关系图
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];//行和列 
		}
	} 
	//设置队首和队尾
	//填的是数据对 
	f=r=1;//队尾和队首都是从编号1开始
	//自己和自己的关系 
	q[f][0]=x;//和自己的关系是0 
	q[f][1]=0; 
	p[x]=false; 
	//进行队列的操作
	while(f<=r){//队首小于队尾 
		tmp=q[f][0];
		//先判断tmp是不是他要找的人
		if(tmp==y){//找到了 
			cout<<q[f][1]-1<<endl;//关系要减1,才是真正的关系 
			return 0; //找到了就输出,一定可以找到 
		}
		//不认识的情况 
		for(int i=1;i<=n;i++){
			//遍历每个与tmp 认识的人
			//从他认识的人找关系 
			if(p[i]&&a[i][tmp]){//p[i]表示没走过,a[i][tmp]表示认识 
				r++;//队尾++
				q[r][0]=i;//遍历出来有关系的人要入队!!! 
				q[r][1]=q[f][1]+1;//标记当前的关系层数 
				//进了一个人了,要加+1
				p[i]=false;//设置开关,已知循环 
			} 
		}
		//不认识的就出对 
		f++;//每一次队头的那个数都不一样,要++;已经排除了找过的人 
	} 
	
	return 0;
}

下面是简单版本的——

#include
#include
#include
using namespace std;

//数组来存关系图,还要有个队列1、编号,2、关系数
int a[105][105],q[10010][2];
bool p[105];
int main(void){
	memset(p,true,sizeof(p));
	int i,j,x,y,n,f,r,tmp;
	cin>>n>>x>>y;
	//读图
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}

	//设置队首队尾
	f=r=1;
	q[f][0]=x;
	q[f][1]=0;
	p[x]=false;

	//开始进行队列的操作
	while(f<=r){
		tmp=q[f][0];
		//先判断tmp是不是他要找的人
		if(tmp==y){
			cout<<q[f][1]-1<<endl;
			return 0;
		}

		for(i=1;i<=n;i++){
			//遍历每个与tmp认识的人
			if(p[i]&&a[i][tmp]){
				r++;
				q[r][0]=i;//遍历出来有关系的人要入队
				q[r][1]=q[f][1]+1;//标记当前的关系层数
				p[i]=false;
			}
		}
		f++;//队头出队
	}
	return 0;
}

大家下次见啊啊啊

Thanks♪(・ω・)ノ

收藏,关注,点赞!!!谢谢!!!

你可能感兴趣的:(c++,课课通)