关系网络

有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进行搜索 
}
posted @ 2023-04-25 19:20  Momo·Trace  阅读(181)  评论(0编辑  收藏  举报