【多源 BFS】1. 01 矩阵(medium)
多源 BFS
- 多源最短路问题简介
- 1. 01 矩阵(medium)
- 题⽬描述:
- 解法(bfs)(多个源头的最短路问题)
- 算法思路:
- 算法代码:
多源最短路问题简介

1. 01 矩阵(medium)
题⽬链接:542. 01 矩阵
题⽬描述:
给定⼀个由 0 和 1 组成的矩阵 mat ,请输出⼀个⼤⼩相同的矩阵,其中每⼀个格⼦是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
⽰例 1:

输⼊:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]
⽰例 2:

输⼊:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]
提⽰:
m = = mat.length
n = = mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j] is either 0 or 1.
mat 中⾄少有⼀个 0
解法(bfs)(多个源头的最短路问题)

算法思路:
对于求的最终结果,我们有两种⽅式:
• 第⼀种⽅式:从每⼀个 1 开始,然后通过层序遍历找到离它最近的 0 。
这⼀种⽅式,我们会以所有的 1 起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果矩阵中只有⼀个 0 的话,每⼀次层序遍历都要遍历很多层,时间复杂度较⾼。
• 换⼀种⽅式:从 0 开始层序遍历,并且记录遍历的层数。当第⼀次碰到 1 的时候,当前的层数就是这个 1 离 0 的最短距离。
这⼀种⽅式,我们在遍历的时候标记⼀下处理过的 1 ,能够做到只⽤遍历整个矩阵⼀次,就能得到最终结果。
但是,这⾥有⼀个问题, 0 是有很多个的,我们怎么才能保证遇到的 1 距离这⼀个 0 是最近的呢?
其实很简单,我们可以先把所有的 0 都放在队列中,把它们当成⼀个整体,每次把当前队列⾥⾯的所有元素向外扩展⼀次。
算法代码:
class Solution
{int[] dx = {0, 0, -1, 1};int[] dy = {1, -1, 0, 0};public int[][] updateMatrix(int[][] mat) {int m = mat.length, n = mat[0].length;// dist[i][j] == -1:标记当前位置没有被搜索过// dist[i][j] != -1:存的是最短距离int[][] dist = new int[m][n];for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)dist[i][j] = -1;Queue<int[]> q = new LinkedList<>();// 1. 把所有的源点加⼊到队列⾥⾯for(int i = 0; i < m; i++)for(int j = 0; j < n; j++){if(mat[i][j] == 0){dist[i][j] = 0;q.add(new int[]{i, j});}}// 2. ⼀层⼀层的往外扩while(!q.isEmpty()){int[] t = q.poll();int a = t[0], b = t[1];for(int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.add(new int[]{x, y});}}}return dist;}
}
