classSolution{public:intshortestDistance(vector<vector<int>>&grid){constintm=grid.size();constintn=grid[0].size();constintnBuildings=getBuildingCount(grid);constvector<int>dirs{0,1,0,-1,0};intans=INT_MAX;// dist[i][j] := total distance of grid[i][j] (0) to reach all buildings (1)vector<vector<int>>dist(m,vector<int>(n));// reachCount[i][j] := # of buildings (1) grid[i][j] (0) can reachvector<vector<int>>reachCount(m,vector<int>(n));autobfs=[&](introw,intcol)->bool{queue<pair<int,int>>q{{{row,col}}};vector<vector<bool>>seen(m,vector<bool>(n));seen[row][col]=true;intdepth=0;intseenBuildings=1;while(!q.empty()){++depth;for(intsz=q.size();sz>0;--sz){constauto[i,j]=q.front();q.pop();for(intk=0;k<4;++k){constintx=i+dirs[k];constinty=j+dirs[k+1];if(x<0||x==m||y<0||y==n)continue;if(seen[x][y])continue;seen[x][y]=true;if(!grid[x][y]){dist[x][y]+=depth;++reachCount[x][y];q.emplace(x,y);}elseif(grid[x][y]==1){++seenBuildings;}}}}returnseenBuildings==nBuildings;};for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(grid[i][j]==1)// Bfs from this buildingif(!bfs(i,j))return-1;for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(reachCount[i][j]==nBuildings)ans=min(ans,dist[i][j]);returnans==INT_MAX?-1:ans;}private:intgetBuildingCount(vector<vector<int>>&grid){returnaccumulate(begin(grid),end(grid),0,[](ints,vector<int>&row){returns+count(begin(row),end(row),1);});}};
classSolution{publicintshortestDistance(int[][]grid){finalintm=grid.length;finalintn=grid[0].length;finalintnBuildings=getBuildingCount(grid);intans=Integer.MAX_VALUE;// dist[i][j] := total distance of grid[i][j] (0) to reach all buildings (1)int[][]dist=newint[m][n];// reachCount[i][j] := # of buildings (1) grid[i][j] (0) can reachint[][]reachCount=newint[m][n];for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(grid[i][j]==1)// Bfs from this buildingif(!bfs(grid,i,j,dist,reachCount,nBuildings))return-1;for(inti=0;i<m;++i)for(intj=0;j<n;++j)if(reachCount[i][j]==nBuildings)ans=Math.min(ans,dist[i][j]);returnans==Integer.MAX_VALUE?-1:ans;}privatestaticfinalint[]dirs={0,1,0,-1,0};privatebooleanbfs(int[][]grid,introw,intcol,int[][]dist,int[][]reachCount,intnBuildings){finalintm=grid.length;finalintn=grid[0].length;Queue<int[]>q=newArrayDeque<>(Arrays.asList(newint[]{row,col}));boolean[][]seen=newboolean[m][n];seen[row][col]=true;intdepth=0;intseenBuildings=1;while(!q.isEmpty()){++depth;for(intsz=q.size();sz>0;--sz){finalinti=q.peek()[0];finalintj=q.poll()[1];for(intk=0;k<4;++k){finalintx=i+dirs[k];finalinty=j+dirs[k+1];if(x<0||x==m||y<0||y==n)continue;if(seen[x][y])continue;seen[x][y]=true;if(grid[x][y]==0){dist[x][y]+=depth;++reachCount[x][y];q.offer(newint[]{x,y});}elseif(grid[x][y]==1){++seenBuildings;}}}}returnseenBuildings==nBuildings;}privateintgetBuildingCount(int[][]grid){intbuildingCount=0;for(int[]row:grid)for(finalintcell:row)if(cell==1)++buildingCount;returnbuildingCount;}}
classSolution:defshortestDistance(self,grid:List[List[int]])->int:m=len(grid)n=len(grid[0])dirs=[0,1,0,-1,0]nBuildings=sum(a==1forrowingridforainrow)ans=math.inf# dist[i][j] := total distance of grid[i][j] (0) to reach all buildings (1)dist=[[0]*nfor_inrange(m)]# reachCount[i][j] := # Of buildings (1) grid[i][j] (0) can reachreachCount=[[0]*nfor_inrange(m)]defbfs(row:int,col:int)->bool:q=deque([(row,col)])seen={(row,col)}depth=0seenBuildings=1whileq:depth+=1for_inrange(len(q)):i,j=q.popleft()forkinrange(4):x=i+dirs[k]y=j+dirs[k+1]ifx<0orx==mory<0ory==n:continueif(x,y)inseen:continueseen.add((x,y))ifnotgrid[x][y]:dist[x][y]+=depthreachCount[x][y]+=1q.append((x,y))elifgrid[x][y]==1:seenBuildings+=1# True if all buildings (1) are connectedreturnseenBuildings==nBuildingsforiinrange(m):forjinrange(n):ifgrid[i][j]==1:# Bfs from this buildingifnotbfs(i,j):return-1foriinrange(m):forjinrange(n):ifreachCount[i][j]==nBuildings:ans=min(ans,dist[i][j])return-1ifans==math.infelseans