zoukankan      html  css  js  c++  java
  • (并查集 or BFS+二分)HDU5652

    点击打开链接



    并查集:

    #include<cstdio>
    #define N 505
    using namespace std;
    struct node
    {
        int x,y;
    };
    char map[N][N];
    node p[N*N];
    int turnx[4]={0,0,-1,1};
    int turny[4]={-1,1,0,0};
    int father[N*N];
    int rank[N*N];
    int find(int x)
    {
        if(father[x]!=x)
        father[x]=find(father[x]);
        return father[x];
    }
    void connect(int a,int b)
    {
        a=find(a);
        b=find(b);
        if(a!=b)
        {
            if(rank[a]>rank[b])
            father[b]=a;
            else if(rank[a]<rank[b])
            father[a]=b;
            else
            {
                father[a]=b;
                rank[b]++;
            }
        }
    }
    int main()
    {
        int T;
        int i,j;
        int n,m,q;
        int china,india;
        int dx,dy;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++)
            scanf("%s",map[i]+1);
            scanf("%d",&q);
            for(i=1;i<=q;i++)
            {
                scanf("%d%d",&p[i].x,&p[i].y);
                ++p[i].x,++p[i].y;
                map[p[i].x][p[i].y]='1';
            }
            for(i=1;i<=n*m+2;i++)
            {
                father[i]=i;
                rank[i]=0;
            }
            china=n*m+1;
            india=n*m+2;
            for(i=1;i<=m;i++)
            {
                if(map[1][i]=='0')
                connect(i,china);
                if(map[n][i]=='0')
                connect((n-1)*m+i,india);
            }
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=m;j++)
                {
                    if(map[i][j]=='0')
                    {
                        if(i<n&&map[i+1][j]=='0')
                        connect(i*m+j,(i-1)*m+j);
                        if(j<m&&map[i][j+1]=='0')
                        connect((i-1)*m+j+1,(i-1)*m+j);
                    }
                }
            }
            if(find(china)==find(india))
            {
                printf("-1
    ");
                continue;
            }
            for(i=q;i>0;i--)
            {
                map[p[i].x][p[i].y]='0';
                if(p[i].x==1)
                connect(p[i].y,china);
                if(p[i].x==n)
                connect((n-1)*m+p[i].y,india);
                for(j=0;j<4;j++)
                {
                    dx=p[i].x+turnx[j];
                    dy=p[i].y+turny[j];
                    if(dx>0&&dx<=n&&dy>=0&&dy<=m&&map[dx][dy]=='0')
                    connect((dx-1)*m+dy,(p[i].x-1)*m+p[i].y);
                }
                if(find(china)==find(india))
                break;
            }
            printf("%d
    ",i);
        }
        return 0;
    }
    



    BFS+二分:

    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<stack>
    using namespace std;
    int n,m;
    char map[510][510];
    int visit[510][510];
    int turnx[4]={1,-1,0,0};
    int turny[4]={0,0,1,-1};
    struct node
    {
        int x;
        int y;
    };
    node u[300000];
    int yes(int x,int y)
    {
        if(x<0||y<0||x>n+1||y>=m||map[x][y]=='1')
        return 0;
        return 1;
    }
    queue<node> s;
    int bfs()
    {
        int i;
        node p,q;
        p.x=0;
        p.y=0;
        visit[p.x][p.y]=1;
        s.push(p);
        while(!s.empty())
        {
            p=s.front();
            s.pop();
            if(p.x==n+1&&p.y==0)
            {
                while(!s.empty())
                s.pop();
                return 1;
            }
            for(i=0;i<4;i++)
            {
                q=p;
                q.x+=turnx[i];
                q.y+=turny[i];
                if(!visit[q.x][q.y]&&yes(q.x,q.y))
                {
                    visit[q.x][q.y]=1;
                    s.push(q);
                }
            }
        }
        return 0;
    }
    int main()
    {
        int T,Q,i,begin,end,mid;
        scanf("%d",&T);
        while(T--)
        {
            while(!s.empty())
            s.pop();
            scanf("%d%d",&n,&m);
            for(i=0;i<m;i++)
            {
                map[0][i]='0';
                map[n+1][i]='0';
            }
            memset(visit,0,sizeof(visit));
            for(i=1;i<=n;i++)
            scanf("%s",map[i]);
            scanf("%d",&Q);
            for(i=1;i<=Q;i++)
            {
                scanf("%d%d",&u[i].x,&u[i].y);
                ++u[i].x;
            }
            begin=1;
            end=Q;
            while(begin<=end)
            {
                mid=(begin+end)/2;
                memset(visit,0,sizeof(visit));
                for(i=begin;i<=mid;i++)
                map[u[i].x][u[i].y]='1';
                for(i=mid+1;i<=end;i++)
                map[u[i].x][u[i].y]='0';
                if(bfs()==1)
                begin=mid+1;
                else
                end=mid;
                if(begin==end)
                {
                    mid=begin;
                    break;
                }
            }
            printf("%d
    ",mid);
        }
        return 0;
    }
    
    
    
    
     
    

     

  • 相关阅读:
    php对接java平台 sha256 加密 签名验证不过
    iframe里面表单提交后如何跳出iframe重定向到另一个页面
    composer update install require 三个命令的的别
    PHP RabbitMQ实现简单的延迟队列
    CentOS 7 RPM 离线安装 MySQL 8
    解决SSH连接Linux主机Broken pipe问题
    Oracle查询连接数
    Oracle SYSAUX 表空间减肥
    Oracle URL的几种写法
    Oracle查询和修改序列
  • 原文地址:https://www.cnblogs.com/westwind1005/p/5975237.html
Copyright © 2011-2022 走看看