--- 多源bfs算法 01矩阵---
多源bfs和单源bfs最大的区别是 单源bfs是从一个固定起点开始进行搜索,而多元bfs是从多个点开始同时进行搜索,当第一次有一条路径到达了合适位置,那么他就是一条最近的路
经典多元bfs 01矩阵

题目要求是返回所有为1的位置于他最近的0的距离,那么就而数组中可能有多个1如果是一个一个的单源bfs,那时间复杂度就很恐怖了,所以可以使用多元bifs, 把所有的为1的位置给放到队列中,让后对他们统一出队列进行bfs搜索,可是这样就有了一个新的问题,再我从1开始进行搜索时,如果下一个为1,那么我当前1的最短距离应该取决于这个1的最短距离,而我并不能知道他的最短距离,所以储存1的位置行不通
那么我可以改为储存0的位置,那么再碰到有1时,那么这个1距离最近的位置就是1,并且在碰到被1包裹的1,那么也能通过他周围储存的最短距离来获取到最近的距离
对于多源bfs的编写,于单源不同的是只需要把所有需要遍历的点给预处理放到队列中就好,在bfs时,也不需要管是不是最近的,因为他们的步长相同,所以在第一次遇到,那么肯定是最近的路径
实现
public int[][] updateMatrix(int[][] mat) {int m = mat.length;int n = mat[0].length;int[][] ret = new int[m][n];for (int i = 0; i < m; i++) {Arrays.fill(ret[i], -1);}Queue<int[]> queue = new LinkedList<>();for (int y = 0; y < m; y++) {for (int x = 0; x < n; x++) {if (mat[y][x] == 0) {queue.add(new int[]{y, x});ret[y][x] = 0;}}}int[] dy = new int[]{-1, 1, 0, 0};int[] dx = new int[]{0, 0, -1, 1};while (!queue.isEmpty()) {int[] poi = queue.poll();for (int j = 0; j < 4; j++) {int y = poi[0] + dy[j];int x = poi[1] + dx[j];if (y < 0 || y == m || x < 0 || x == n || ret[y][x] != -1 || mat[y][x] == 0) continue;ret[y][x] = ret[poi[0]][poi[1]] + 1;queue.add(new int[]{y, x});}}return ret;}多源bfs的题还有
飞地的数量 地图中的最高点 地图分析
