P3663 [USACO17FEB]Why Did the Cow Cross the Road III S
阿新 • • 發佈:2018-12-16
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; }