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;
}