• c++多源BFS


    C++多源BFS(Multiple Source BFS)是一种基于广度优先搜索的算法,用于在一个图中找到多个起点到达同一个目标点的最短路径。

    具体实现步骤如下:

    1.初始化:将所有起点的坐标加入队列,并将它们的距离设为0。

    2.进行BFS:从队列中取出一个起点,遍历其周围的点,若该点未被访问过,则将其加入队列中,并更新它的距离为当前起点的距离+1。

    3.终止条件:当队列为空时,搜索结束。

    4.返回结果:返回目标点的距离。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N = 100010;
    6. int h[N], e[N], ne[N], idx;
    7. int dist[N];
    8. int n, m;
    9. void add(int a, int b)
    10. {
    11. e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
    12. }
    13. int bfs()
    14. {
    15. queue<int> q;
    16. for (int i = 1; i <= n; i ++ )
    17. if (dist[i] == 0) q.push(i);
    18. while (q.size())
    19. {
    20. int t = q.front(); q.pop();
    21. for (int i = h[t]; i != -1; i = ne[i])
    22. {
    23. int j = e[i];
    24. if (dist[j] != 0) continue;
    25. dist[j] = dist[t] + 1;
    26. q.push(j);
    27. }
    28. }
    29. return dist[m];
    30. }
    31. int main()
    32. {
    33. cin >> n >> m;
    34. memset(h, -1, sizeof h);
    35. for (int i = 1; i <= n; i ++ )
    36. {
    37. int a, b;
    38. cin >> a >> b;
    39. add(i, a); add(i, b);
    40. }
    41. cout << bfs() << endl;
    42. return 0;
    43. }

    题目:

    给定一个 N 行 M 列的 01 矩阵 A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为:

    dist(A[i][j],A[k][l])=|i−k|+|j−l|
    输出一个 N 行 M 列的整数矩阵 B,其中:

    B[i][j]=min1≤x≤N,1≤y≤M,A[x][y]=1dist(A[i][j],A[x][y])
    输入格式
    第一行两个整数 N,M。

    接下来一个 N 行 M 列的 01矩阵,数字之间没有空格。

    输出格式
    一个 N 行 M 列的矩阵 B,相邻两个整数之间用一个空格隔开。

    数据范围
    1≤N,M≤1000
    输入样例:

    1. 3 4
    2. 0001
    3. 0011
    4. 0110

    输出样例:

    1. 3 2 1 0
    2. 2 1 0 0
    3. 1 0 0 1

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. const int N = 1010;
    7. #define x first
    8. #define y second
    9. typedef pair<int, int> PII;
    10. int n, m;
    11. char g[N][N];
    12. queue q;
    13. int dist[N][N];
    14. void bfs()
    15. {
    16. int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    17. memset(dist, -1, sizeof dist);
    18. for(int i = 1; i <= n;i ++)
    19. {
    20. for(int j = 1; j <= m; j ++)
    21. {
    22. if(g[i][j] == '1')
    23. {
    24. dist[i][j] = 0;
    25. q.push({i, j});
    26. }
    27. }
    28. }
    29. while(q.size())
    30. {
    31. auto t = q.front();
    32. q.pop();
    33. for(int i = 0; i < 4; i ++)
    34. {
    35. int a = t.x + dx[i], b = t.y + dy[i];
    36. if(dist[a][b] != -1) continue;
    37. if(a <= 0 || a > n || b <= 0 || b > m) continue;
    38. dist[a][b] = dist[t.x][t.y] + 1;
    39. q.push({a, b});
    40. }
    41. }
    42. }
    43. int main()
    44. {
    45. cin >> n >> m;
    46. for(int i = 1; i <= n; i ++) scanf("%s", g[i] + 1);
    47. bfs();
    48. for(int i = 1; i <= n; i ++)
    49. {
    50. for(int j = 1; j <= m; j ++) printf("%d ", dist[i][j]);
    51. puts("");
    52. }
    53. return 0;
    54. }

    1、用字符输入更快一点吧

    2、使用偏移量代表四个方向,初始化距离

    3、判断入队的条件,如果字符为1,那么该点的距离为0,而且入队

    4、如果该点被使用过了或者出界了,那么跳过

    5、跳的点的距离等于上一个点的距离再加一

    明白的小伙伴麻烦点个赞吧

  • 相关阅读:
    Android流式布局
    如果Domino上的邮件无法直接发送到@outlook.com
    mac 13 设置日期显示节假日
    Istio 自动注入 sidecar 失败导致无法访问webhook服务
    深信服科技:2023网络安全深度洞察及2024年趋势研判报告
    JAVA代码审计——WebGoat 认证缺陷
    事件循环深度学习
    Spring事务原理
    前端学习案例-有哪些是你成为一名开发之后才知道的事情2021
    OpenCV官方教程中文版 —— 直方图均衡化
  • 原文地址:https://blog.csdn.net/2301_76180325/article/details/133232948