[USACO17FEB]Why Did the Cow Cross the Road III S
阿新 • • 發佈:2018-12-17
題目
思路
大力BFS/DFS找每個連通塊的牛數,然後大力求解不同連通塊的牛對即可(乘法原理+加法原理可以優化)
複雜度只有O(n2+k2)(優化後只有O(n2+O(連通塊數))
程式碼
#include<bits/stdc++.h> using namespace std; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int b[105][105][4]; int x[105],y[105]; int vis[105][105]; int ans,t,n,k,r; struct xxx{ int x,y; }q[10005]; void bfs(int s) { int head=1; int tail=1; q[head].x=x[s]; q[head].y=y[s]; vis[x[s]][y[s]]=++t; for(;head<=tail;head++){ int xx=q[head].x; int yy=q[head].y; for(int i=0;i<4;i++) if(b[xx][yy][i]==0){ int tx=xx+dx[i]; int ty=yy+dy[i]; if(tx<1||ty<1||tx>n||ty>n)continue; if(vis[tx][ty])continue; vis[tx][ty]=t; q[++tail].x=tx; q[tail].y=ty; } } } int main() { scanf("%d%d%d",&n,&k,&r); memset(b,0,sizeof(b)); for(int i=1;i<=r;i++){ int x,y,tx,ty; scanf("%d%d%d%d",&x,&y,&tx,&ty); if(x==tx){ if(y<ty)b[x][y][0]=1,b[tx][ty][2]=1; else b[x][y][2]=1,b[tx][ty][0]=1; } else{ if(x<tx)b[x][y][1]=1,b[tx][ty][3]=1; else b[x][y][3]=1,b[tx][ty][1]=1; } } for(int i=1;i<=k;i++){ scanf("%d%d",&x[i],&y[i]); } for(int i=1;i<=k;i++) if(!vis[x[i]][y[i]])bfs(i); for(int i=1;i<=k;i++) for(int j=i+1;j<=k;j++) if(vis[x[i]][y[i]]!=vis[x[j]][y[j]]) ans++; printf("%d",ans); return 0; }