1 描述
有n个人,他们的编号为1~n,其中有一些人相互认识,现在x想要认识y,可以通过他所认识的人来认识更多的人,如果x认识z,z认识y,那么x可以通过z认识y,求出x最少需要通过多少人才能认识y。
2 输入描述
第1行3个整数n、x、y,2≤n≤100,1≤x,y≤n。
接下来是一个n×n的邻接矩阵,a[i,j]=1,表示i和j认识,0表示不认识。
保证i=j时,a[i,j]=0,并且a[i,j]= a[j,i]。行中的每两个数之间用一个空格分开。
3 输出描述
输出一行一个数,表示x认识y最少需要通过的人数。
4 样例输入
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
5 输出
2
问题分析
广度优先搜索,
根据测试用例1 为起点:初始值head =1 ,tail=1
(1)起点为1,head=1,tail=2
b[1].x=1,遍历1认识谁,从1~n逐个,1和2 认识,则b[2].x=2,b[2].step=b[1].step+1=0+1=1; tail++;
转第(2)步
(2)1=>2,起点为2,head=2,tail=3
b[2].x=2,遍历2认识谁,从1~n逐个,2和3 认识,则b[3].x=3,b[3].step=b[2].step+1=1+1=2; tail++;转第(3)步
,2和4 认识,则b[4].x=4,b[4].step=b[2].step+1=1+1=2; tail++; 转第(4)步
(3)1=>2=>3,起点为3,head=3,tail=4
b[3].x=3,遍历3认识谁,从1~n逐个,3和4 认识,则b[5].x=4,b[5].step=b[3].step+1=2+1=3;tail++;
(4)1=>2=>4,起点为4,head=4,tail=5
b[4].x=4,遍历4认识谁,从1~n逐个,4和5 认识,则b[6].x=5,b[6].step=b[4].step+1=2+1=3;tail++;
(5)找到终点y=5,b[6].step=3,减去初始值1。输出 2
代码实现
#include<bits/stdc++.h>
using namespace std;
int n, x, y, mmap[101][101], a[101][101], sum = 1,head=1,tail=1;
struct node
{
int x, y,step=0;
}b[50000];
void dfs()
{
b[tail].x = x;
tail++;
while(head <= tail)
{
for (int i=1; i <= n ;i ++)
{
int xx = b[head].x ;
int yy = i;
if (yy <=n && mmap[xx][yy] == 0 && a[xx][yy]==1 )
{
mmap[xx][yy] = 1;
b[tail].x = yy;
b[tail] . step = b[head].step + 1;
tail++;
}
if( b[tail - 1].x == y)
{
sum = 0;
cout << b[tail - 1] . step -1;
return;
}
}
head++;
}
}
int main(){
cin >> n >> x >> y;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
cin >> a[i][j];
}
}
dfs();
if(sum ==1)
{
cout<< -1;
}
return 0;
}