structT{inti;intj;intheight;T(inti,intj,intheight):i(i),j(j),height(height){}};classSolution{public:intcutOffTree(vector<vector<int>>&forest){autocompare=[&](constT&a,constT&b){returna.height>b.height;};priority_queue<T,vector<T>,decltype(compare)>minHeap(compare);for(inti=0;i<forest.size();++i)for(intj=0;j<forest[0].size();++j)if(forest[i][j]>1)minHeap.emplace(i,j,forest[i][j]);intans=0;intx=0;inty=0;while(!minHeap.empty()){constauto[i,j,_]=minHeap.top();minHeap.pop();// Walk from (x, y) to (i, j)constintsteps=bfs(forest,x,y,i,j);if(steps<0)return-1;ans+=steps;x=i;y=j;}returnans;}private:constvector<int>dirs{0,1,0,-1,0};intbfs(constvector<vector<int>>&forest,intsi,intsj,intei,intej){constintm=forest.size();constintn=forest[0].size();intsteps=0;queue<pair<int,int>>q{{{si,sj}}};vector<vector<bool>>seen(m,vector<bool>(n));seen[si][sj]=true;while(!q.empty()){for(ints=q.size();s>0;--s){constauto[i,j]=q.front();q.pop();if(i==ei&&j==ej)returnsteps;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]||forest[x][y]==0)continue;q.emplace(x,y);seen[x][y]=true;}}++steps;}return-1;};};
classT{publicinti;publicintj;publicintheight;publicT(inti,intj,intheight){this.i=i;this.j=j;this.height=height;}}classSolution{publicintcutOffTree(List<List<Integer>>forest){Queue<T>minHeap=newPriorityQueue<>((a,b)->a.height-b.height);for(inti=0;i<forest.size();++i)for(intj=0;j<forest.get(0).size();++j)if(forest.get(i).get(j)>1)minHeap.offer(newT(i,j,forest.get(i).get(j)));intans=0;intx=0;inty=0;while(!minHeap.isEmpty()){finalinti=minHeap.peek().i;finalintj=minHeap.poll().j;// Walk from (x, y) to (i, j)finalintsteps=bfs(forest,x,y,i,j);if(steps<0)return-1;ans+=steps;x=i;y=j;}returnans;}privatestaticfinalint[]dirs={0,1,0,-1,0};privateintbfs(List<List<Integer>>forest,intsi,intsj,intei,intej){finalintm=forest.size();finalintn=forest.get(0).size();intsteps=0;Queue<int[]>q=newArrayDeque<>(Arrays.asList(newint[]{si,sj}));boolean[][]seen=newboolean[m][n];seen[si][sj]=true;while(!q.isEmpty()){for(intsz=q.size();sz>0;--sz){finalinti=q.peek()[0];finalintj=q.poll()[1];if(i==ei&&j==ej)returnsteps;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]||forest.get(x).get(y)==0)continue;q.offer(newint[]{x,y});seen[x][y]=true;}}++steps;}return-1;};}