帮同学求助道题,就A了第一个点。
#include<bits/stdc++.h>
using namespace std;
int n,cnt,ret,x[1010][1010],f[1000100],rk[1000100];
struct node{
int u,v,w;
}a[1010000];
bool cmp(node a,node b){
return a.w<b.w;
}int to(int i,int j){
return (i-1)*n+j;
}int getfa(int x){
if(x==f[x]){
return x;
}return f[x]=getfa(f[x]);
}void merge(int x,int y){
f[getfa(x)]=getfa(y);
rk[getfa(y)]+=rk[getfa(x)];
}int main(){
scanf("%d",&n);
for(int i=1;i<=n*n;i++){
f[i]=i,rk[i]=1;
}for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&x[i][j]);
}
}for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i>1){
a[++cnt].u=to(i,j),a[cnt].v=to(i-1,j),a[cnt].w=abs(x[i-1][j]-x[i][j]);
}if(j>1){
a[++cnt].u=to(i,j),a[cnt].v=to(i,j-1),a[cnt].w=abs(x[i][j-1]-x[i][j]);
}if(i<n){
a[++cnt].u=to(i,j),a[cnt].v=to(i+1,j),a[cnt].w=abs(x[i+1][j]-x[i][j]);
}if(j<n){
a[++cnt].u=to(i,j),a[cnt].v=to(i,j+1),a[cnt].w=abs(x[i][j+1]-x[i][j]);
}
}
}sort(a+1,a+cnt+1,cmp);
for(int i=1;i<=cnt;i++){
if(getfa(a[i].u)!=getfa(a[i].v)){
merge(a[i].u,a[i].v);
if(rk[getfa(a[i].v)]>(n*n)/2){
printf("%d",a[i].w);
return 0;
}
}
}return 0;
}