1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n,m,a[1001][1001],fd[4][2]={{1,0},{-1,0},{0,1},{0,-1}},mis[1000001],cnt,mx[1000001]; struct edge{ int x,y,z; }; struct node{ int x,y; }; vector<edge>e; vector<node>t[1000001]; int find(int x){ return mis[x]==x?x:mis[x]=find(mis[x]); } void dfs(int x,int fa){ for(auto [y,z]:t[x]){ if(y==fa) continue; mx[y]=max(mx[x],z); dfs(y,x); } } int main(){ cin>>n>>m; for(int i=1;i<=n*m;i++) mis[i]=i; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ bool fl=0; for(int k=0;k<4;k++){ int tx=i+fd[k][0],ty=j+fd[k][1]; if(tx<1||tx>n||ty<1||ty>m){fl=1;continue;} e.push_back({(i-1)*m+j,(tx-1)*m+ty,max(a[i][j],a[tx][ty])}); } if(fl) e.push_back({(i-1)*m+j,0,max(0,a[i][j])}); } } sort(e.begin(),e.end(),[](edge x,edge y){return x.z<y.z;}); for(auto [x,y,z]:e){ int fx=find(x),fy=find(y); if(fx!=fy){ mis[fx]=fy; t[x].push_back({y,z}),t[y].push_back({x,z}); if(++cnt==n*m-1) break; } } dfs(0,-1); for(int i=1;i<=n*m;i++){ cout<<max(mx[i]-a[(i-1)/m+1][(i-1)%m+1],0)<<' '; if(i%m==0) cout<<'\n'; } return 0; }
- 1
信息
- ID
- 4
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者