广搜——关系网络(c++)

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;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值