P3663 [USACO17FEB]Why Did the Cow Cross the Road III S

bfs/dfs求联通块的题
维护一个三维数组vis[ ][ ][ ],第三维表示在某一方向上两点之间是否联通,然后bfs求联通块就可以了

竟然是蓝题

P3663 [USACO17FEB]Why Did the Cow Cross the Road III S

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;

int N,K,R;
int _map[105][105];
int vis[105][105][4];
int dx[]={0,0,0,1,-1},
    dy[]={0,1,-1,0,0};

int cnt;
queue<int> qx,qy;

int r1,c1,r2,c2;
int cowx[105],cowy[105];
int ans;

void bfs(int x,int y)
{
    qx.push(x);
    qy.push(y);
    _map[x][y]=cnt;
    while(!qx.empty())
    {
        int m=qx.front();
        int n=qy.front();
        qx.pop();
        qy.pop();
        for(int i=1;i<=4;i++)
        {
            if(vis[m][n][i]==0)
            {
                int xi=m+dx[i];
                int yi=n+dy[i];
/*              if(vis[xi][yi]==1&&_map[xi][yi]==0)
                {
                    _map[xi][yi]=cnt;
                }*/
                if(xi>0&&xi<=N&&yi>0&&yi<=N&&_map[xi][yi]==0)
                {
                    qx.push(xi);
                    qy.push(yi);
                    _map[xi][yi]=cnt;
                }
            }
        }
    }

}

int main()
{
//  freopen("testdata.in","r",stdin);
//  freopen("test.out","w",stdout);
    scanf("%d%d%d",&N,&K,&R);
    for(int i=1;i<=R;i++)
    {
        scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
        if(r1==r2)
        {
      /*    int dx[]={0,0,0,1,-1},
                dy[]={0,1,-1,0,0};*/
            if(c1<c2)
            {
                vis[r1][c1][1]=1;
                vis[r2][c2][2]=1;
            }
            else 
            {
                vis[r1][c1][2]=1;
                vis[r2][c2][1]=1;
            }
        }
        if(c1==c2)
        {
            if(r1<r2)
            {
                vis[r1][c1][3]=1;
                vis[r2][c2][4]=1;
            }
            else 
            {
                vis[r1][c1][4]=1;
                vis[r2][c2][3]=1;
            }
        }
    }

    for(int i=1;i<=K;i++)
    {
        scanf("%d%d",&cowx[i],&cowy[i]);
    }
    
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=N;j++)
        {
            if(_map[i][j]==0)
            {
                cnt++;
                bfs(i,j);
            }
        }
    }
        

    for(int i=1;i<=K;i++)
    {
        for(int j=i+1;j<=K;j++)
        {
            //if(_map[cowx[i]][cowy[i]]!=0)
            if(_map[cowx[i]][cowy[i]]!=_map[cowx[j]][cowy[j]])
            {
                ans++;
            }
        }
    }

    printf("%d",ans);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/hhy-OI/p/10125922.html