超详细题解
2024-06-17 17:35:04
发布于:上海
53阅读
0回复
0点赞
#include<iostream>
#include<queue>//导入头文件queue用来完成广搜程序
using namespace std;//命名空间std
int n,x,y,s=2147483647;//s存储最少人数;n、x、y见题目
struct node{
int num,steps;//num表示人的编号,steps表示认识编号为num的人需要多少步
};//采用结构体队列来完成bfs
bool rela[100][100],vis[100][100];//rela[100][100](relative)存储认识的人
//vis[100][100]存储是否通过这个人认识过了其他人
//如果vis[i][j]为1,那么说明i通过j认识了其他人,将不再通过j来认识别人
void bfs(int m){//广搜(bfs)函数定义
queue<node>q;//开一个数组
q.push({m,0});//先存进队列中
while(!q.empty()){
node f=q.front();//获取队首元素
q.pop();//队首元素出队
if(f.num==y-1)s=min(s,f.steps);//如果找到了,那么更新一下s变量
for(int i=0;i<n;i++){//从0到n-1来遍历,当然你也可以把下标变为1到n的闭区间内的整数,那样子记得开数组长度为101
if(rela[i][f.num]==1&&!vis[i][f.num]){//判断是否互相认识而且未通过i来认识其他人
vis[i][f.num]=1,vis[f.num][i]=1;//这里因为i和j认识,那么j和i也认识,所以是双向的,因此两端都要标记一下
q.push({i,f.steps+1});//存到队列里继续搜索
}
}
}
}
int main(){
cin>>n>>x>>y;//输入n、x、y三个变量
for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>rela[i][j];//输入关系网络
bfs(x-1);//调用函数广搜
cout<<s-1;//这里减一是因为不包括x和y两个人,我们搜索的过程中是不包括x的,但是包括了y,因此把y减掉
return 0;//结束程序
}
简单地说,这里关系网络是一个无向图,如果rela[i][j]
为1,那么说明i和j两个节点(顶点)有边连接,由于这个是张无向图,可以得出j和i也有连接,即rela[j][i]
也是1。
【附】如果有需要,可以到Macw07的一条动态去看一下什么是图。
看在那么详细的题解上,给个赞鼓励一下吧!
如果想加入团队,点击这里
这里空空如也
有帮助,赞一个