SIGABRT RE求助
查看原帖
SIGABRT RE求助
285617
黑影洞人楼主2022/11/14 15:42
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<queue>
#include<cstring>
#define N 514
using namespace std;
inline int read(){
	int ans=0,sym=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')sym=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){ans=ans*10+ch-'0';ch=getchar();}
	return ans*sym;
}
int T,n,m,ans,a[N][N];
int vis[N][N];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
bool flg=0;
struct node{
	int x,y,h;
	bool operator<(const node &a)const{return h>a.h;}
};
priority_queue<node>qq;
int bfs(int x,int y){
	queue<pair<int,int> >q;
	q.push(make_pair(x,y));
	vis[x][y]=1;
	while(!q.empty()){
		pair<int,int> xx=q.front();q.pop();
		if(a[xx.first][xx.second]>a[x][y]){
			if(!(xx.first==1||xx.second==1||xx.first==n||xx.second==m))qq.push((node){xx.first,xx.second,a[xx.first][xx.second]});
			continue;
		}
		for(int i=0;i<4;i++){
			int tx=xx.first+dx[i];
			int ty=xx.second+dy[i];
			if(vis[tx][ty])continue;
			if(tx>1&&ty>1&&tx<n&&ty<m){
				q.push(make_pair(tx,ty));vis[tx][ty]=1;
				if(a[tx][ty]>a[x][y])continue;
				ans+=a[x][y]-a[tx][ty];
			}
		}
	}
}
signed main(){
//	freopen("testlz_1.in","r",stdin); 
	scanf("%d",&T);
	while(T--){
		ans=0;
		scanf("%d%d",&n,&m);
		memset(vis,0,sizeof(vis));
		while(!qq.empty())qq.pop();
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				scanf("%d",&a[i][j]);
				if(i==1||j==1||i==n||j==m)qq.push((node){i,j,a[i][j]});
				//if(a[i][j]<0)ans+=-a[i][j],a[i][j]=0;
			}
		}
		ans=0;
		while(!qq.empty()){
			int xx=qq.top().x,yy=qq.top().y;
			qq.pop();
			bfs(xx,yy);
		}
		printf("%d\n",ans);
	}
	//printf("test:%lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}




2022/11/14 15:42
加载中...