50分,思路并查集,求助!!!
查看原帖
50分,思路并查集,求助!!!
245085
wenxutong楼主2021/8/5 12:50

代码见下面,只有50分

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
struct point{
    int x,y;
};
point f[511][511];
point find(point xx){
    if(xx.x==f[xx.x][xx.y].x&&xx.y==f[xx.x][xx.y].y)return xx;
    f[xx.x][xx.y]=find(f[xx.x][xx.y]);
    return f[xx.x][xx.y];
}
int n,m;
int a[511][511];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
point xu[250011];
int cnt=0,ans;
int main(){
    cin>>n>>m;
    int l=0,r=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            r+=a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int tmp;
            scanf("%d",&tmp);
            if(tmp==1){
                cnt++;
                xu[cnt].x=i,xu[cnt].y=j;
            }
        }
    }
    while(l<=r){
        int mid=(l+r)/2;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                f[i][j].x=i,f[i][j].y=j;
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                for(int k=0;k<4;k++){
                    point tmp;
                    tmp.x=i+dx[k],tmp.y=j+dy[k];
                    if(tmp.x<1||tmp.x>n||tmp.y<1||tmp.y>m)continue;
                    if(abs(a[i][j]-a[tmp.x][tmp.y])<=mid){
                        point q=find(f[i][j]);
                        point p=find(f[tmp.x][tmp.y]);
                        if(p.x!=q.x||p.y!=q.y){
                            f[p.x][p.y]=q;
                        }
                    }
                }
            }
        }
        bool flag=0;
        point biao=find(f[xu[1].x][xu[1].y]);
        for(int i=2;i<=cnt;i++){
            point tmp=find(f[xu[i].x][xu[i].y]);
            if(tmp.x!=biao.x||tmp.y!=biao.y){
                flag=1;
                break;
            }
        }
        if(flag==0){
            r=mid-1;
            ans=mid;
        }else{
            l=mid+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

2021/8/5 12:50
加载中...