[BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)
建出对偶图,删除一条边时将两边的格子连边。一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 using namespace std; 5 6 const int N=1510; 7 char op[3]; 8 int n,Q,ans,a,b,x,y,fa[N*N]; 9 10 int find(int x){ return fa[x]==x ? x : fa[x]=find(fa[x]); } 11 int F(int x,int y){ return (!x || !y || x==n || y==n) ? 0 : (x-1)*n+y; } 12 13 int main(){ 14 freopen("bzoj4423.in","r",stdin); 15 freopen("bzoj4423.out","w",stdout); 16 scanf("%d%d",&n,&Q); 17 rep(i,1,n*n) fa[i]=i; 18 while (Q--){ 19 if (!ans) scanf("%d%d%s%*d%*d%*s",&a,&b,op); 20 else scanf("%*d%*d%*s%d%d%s",&a,&b,op); 21 if (op[0]=='N') x=F(a,b),y=F(a-1,b); else x=F(a,b),y=F(a,b-1); 22 if (find(x)==find(y)) ans=1,puts("NIE"); else ans=0,puts("TAK"); 23 x=find(x); y=find(y); fa[x]=y; 24 } 25 return 0; 26 }