有n个人,他们的编号为1~n,其中有一些人相互认识,现在x想要认识y,可以通过他所认识的人来认识更多的人(如果a认识b,b认识c那么a可以通过b来认识c),求出x最少需要通过多少人才能认识y。
输入
- 第1行3个整数n、x、y,2≤n≤100;
- 接下来的n行是一个nXn的邻接矩阵,a[i][j]=1表示i认识j,a[i][j]=0表示不认识。保证i=j时,a[i][j]=0,并且a[i][j]=a[j][i]。
输出
- 一行一个整数,表示x认识y最少需要通过的人数。数据保证x一定能认识y
样例输入
5 1 5
0 1 0 0 0
1 0 1 1 0
0 1 0 1 0
0 1 1 0 1
0 0 0 1 0
样例输出
2
#include<bits/stdc++.h>
using namespace std;
int a[101][101],f[101],t[101]; //a数组表示矩阵,f数组标记是否找过,t数组表示通过几个人
int n,x,y; //n表示共有多少人,x表示开始,y表示结束
queue<int>bh; //定义队列 bh
int bfs(int x) //从x节点开始搜索
{
bh.push(x); //x节点入队列
t[x]=0; f[x]=1; //一开始通过0个人认识,把x节点标记为找过
while(bh.empty()!=1) //如果队列非空
{
int i=bh.front(); //队首元素为i
if(i==y){ return t[i]-1;} //如果i==y表示找到了,这个时候即通过了 t[i]-1个人
for(int j=1;j<=n;j++) //如果没有找到,看看这个人认识那些人
{
if(a[i][j]==1&&f[j]==0) // a[i][j]==1表示认识并且这个人没找过
{
bh.push(j); //把它认识的人放进队列
t[j]=t[i]+1; //t的值加1
f[j]=1; //这个人被标记成1
}
}
bh.pop(); //当前这个人已经搜索完了,出队列
}
}
int main()
{
int i,j;
cin>>n>>x>>y;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
cout<<bfs(x); //调用bfs进行搜索
}
标签:关系,表示,队列,认识,bh,网络,int,101
From: https://www.cnblogs.com/momotrace/p/guanxi_net.html