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

本文详细讲解了如何通过广度优先搜索在人际关系网络中找到一人认识另一人的最少路径,涉及邻接矩阵的使用和示例代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### C++ 中 DFS 和 BFS 算法的学习与实践 #### 一、基础知识概述 深度优先(Depth First Search, DFS) 和广度优先(Breadth First Search, BFS) 是两种基本的图遍历算法。DFS 主要采用栈结构来实现,而 BFS 则依赖队列完成遍历过程。 对于大规模数据集而言,这两种算法各有特点: - **DFS 特点** - 能够快速找到深度优先的路径。 - 更适合于需要沿一条路径尽可能深地探索的应用场景[^3]。 - **BFS 特点** - 找到最短路径的能力使其成为处理距离计算的理想选择。 - 遍历离起始节点较近的节点效率高,但在大型网络中占用较多内存资源[^2]。 #### 二、具体应用场景分析 这些算法不仅限于理论研究,在实际编程中有广泛用途: - 图像识别领域内的连通区域标记可以借助 DFS 或者 BFS 来高效执行; - 迷宫游戏设计里利用它们模拟玩家移动路线规划; - 社交媒体平台好友推荐机制也离不开此类技术的支持; 此外,还有更多有趣的实例等待开发者挖掘并应用于项目开发之中。 #### 三、C++ STL 库支持下的代码样例展示 下面分别给出了基于标准模板库(Standard Template Library, STL)容器类 vector<int> 表达邻接表形式存储图形结构下简单的 DFS 和 BFS 函数定义及其调用方式说明。 ##### (一)DFS 实现 ```cpp #include <iostream> #include <vector> using namespace std; void dfs(const int& node, const vector<vector<int>>& adjList, vector<bool>& visited){ cout << "Visit Node:" << node << endl; visited[node]=true; // Mark current vertex as visited for(auto neighbor : adjList[node]){ if(!visited[neighbor])// If adjacent vertices haven't been traversed yet, dfs(neighbor,adjList,visited); // Recursively visit them. } } ``` 此函数接收三个参数:当前顶点编号 `node` ,表示图关系的数据结构 `adjList` 以及记录访问状态的一维布尔数组 `visited[]`. ##### (二)BFS 实现 ```cpp #include <queue> void bfs(int startNode,vector<vector<int>> &graph,bool *isVisited,int n){ queue<int> q; isVisited[startNode]=true;q.push(startNode); while (!q.empty()){ auto currentNode=q.front();cout<<"Visiting:"<<currentNode<<endl;q.pop(); for(size_t i=0;i<graph[currentNode].size();++i){ if(!isVisited[graph[currentNode][i]]){ isVisited[graph[currentNode][i]]=true; q.push(graph[currentNode][i]); } } } } ``` 上述程序片段展示了如何运用 STL 提供的标准容器——双端队列(queue),配合逻辑运算符轻松构建出完整的广框架[^1]. #### 四、总结建议 为了更好地掌握这两项技能,除了反复练习编写相关题目外,还应该注重理解其背后的原理概念,并尝试将其与其他知识点相结合创造出更复杂的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值