传送门biu~
把网格图转成对偶图,网格图删边相当于在其对偶图上连边,如果对偶图上要连边的两个点曾经连过边,就说明原图删边删出了个环,即原图不连通。用并查集维护联通性。
#include<bits/stdc++.h>
using namespace std;
bool ans=true;
int n,m;
int father[1505*1505];
int search(int x){return father[x]==x?x:father[x]=search(father[x]);}
inline int Calc(int x,int y){
if(x==0 || x==n || y==0 || y==n) return 0;
return x*(n-1)+y;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n*n;++i) father[i]=i;
while(m--){
int x,y,xx,yy;char opt[3],pp[3];
if(ans) scanf("%d%d%s%d%d%s",&x,&y,opt,&xx,&yy,pp);
else scanf("%d%d%s%d%d%s",&xx,&yy,pp,&x,&y,opt);
int xn,yn;
if(opt[0]=='N'){
xn=Calc(x-1,y),yn=Calc(x,y);
xn=search(xn),yn=search(yn);
}
else{
xn=Calc(x,y-1),yn=Calc(x,y);
xn=search(xn),yn=search(yn);
}
if(xn==yn){
ans=false;
printf("NIE\n");
}
else{
father[xn]=yn;
ans=true;
printf("TAK\n");
}
}
return 0;
}