大家好
//先赞后看,已成习惯
这是一道有关于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;
}
大家下次见啊啊啊

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

被折叠的 条评论
为什么被折叠?



