c++多源BFS

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

具体实现步骤如下:

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

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

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

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

#include
#include
#include
using namespace std;

const int N = 100010;

int h[N], e[N], ne[N], idx;
int dist[N];
int n, m;

void add(int a, int b)
{
    e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}

int bfs()
{
    queue q;

    for (int i = 1; i <= n; i ++ )
        if (dist[i] == 0) q.push(i);

    while (q.size())
    {
        int t = q.front(); q.pop();
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] != 0) continue;
            dist[j] = dist[t] + 1;
            q.push(j);
        }
    }

    return dist[m];
}

int main()
{
    cin >> n >> m;

    memset(h, -1, sizeof h);

    for (int i = 1; i <= n; i ++ )
    {
        int a, b;
        cin >> a >> b;
        add(i, a); add(i, b);
    }

    cout << bfs() << endl;

    return 0;
}

题目:

给定一个 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
输入样例:

3 4
0001
0011
0110

输出样例:

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

代码:

#include
#include
#include
#include

using namespace std;

const int N = 1010;

#define x first
#define y second
typedef pair PII;

int n, m;
char g[N][N];
queue q;
int dist[N][N];

void bfs()
{
    int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
    
    memset(dist, -1, sizeof dist);
    
    for(int i = 1; i <= n;i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            if(g[i][j] == '1') 
            {
                dist[i][j] = 0;
                q.push({i, j});
            }
        }
    }
    
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        
        for(int i = 0; i < 4; i ++)
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            
            if(dist[a][b] != -1) continue;
            if(a <= 0 || a > n || b <= 0 || b > m) continue;
            
            dist[a][b] = dist[t.x][t.y] + 1;
            q.push({a, b});
        }
    }
}

int main()
{
    cin >> n >> m;
    
    for(int i = 1; i <= n; i ++) scanf("%s", g[i] + 1);
    
    bfs();
    
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++) printf("%d ", dist[i][j]);
        puts("");
    }
    
    return 0;
}

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

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

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

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

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

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

你可能感兴趣的:(c++,宽度优先,算法)