关系网络

本文介绍了广度优先搜索(BFS)的基本概念和用途,作为图算法的重要原型,BFS被应用于Dijkstra算法和Prim算法中。文章通过分享一道BFS题目,阐述了该算法的系统展开和全面搜索特性,并鼓励读者提出不足之处,以共同学习进步。

大家好

//先赞后看,已成习惯

这是一道有关于BFS的题目

广度优先搜索!!!

知识补充——

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

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

不足之处多多指教!!!

谢谢给位大佬!!!

代码如下——

#include<cstdio>
#include<cstring>
#include<iostream>
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<cstdio>
#include<iostream>
#include<cstring>
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♪(・ω・)ノ

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值