Sol
对偶图+并查集.
思路非常好,将网格图转化成对偶图,在原图中删掉一条边,相当于在对偶图中连上一条边(其实就是网格的格点相互连边),每次加边用并查集维护就可以了.
哦对,还要注意边界就是网格外面看做是一个点就可以了.
PS:好久前的代码.
Code
/************************************************************** Problem: 4423 User: BeiYu Language: C++ Result: Accepted Time:1300 ms Memory:18500 kb ****************************************************************/ #include<cstdio> #define N 1505 struct Union_Find{ int f[N*N]; Union_Find(){for(int i=0;i<N*N;i++) f[i]=i;} int Find(int x){return f[x]==x?x:f[x]=Find(f[x]);} void Union(int u,int v){int f1=Find(u),f2=Find(v);f[f1]=f2;} }UF; int cnt,n,k,idx[N][N]; inline int in(int x=0,char ch=getchar()){while(ch>'9'||ch<'0') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;} int main(){ n=in(),k=in(); for(int i=1;i<n;i++) for(int j=1;j<n;j++) idx[i][j]=++cnt; int u,v,ans=1;char opt[5]; while(k--){ if(ans) u=in(),v=in(),scanf("%s%*d%*d%*s",opt); else scanf("%*d%*d%*s"),u=in(),v=in(),scanf("%s",opt); if(opt[0]=='N') if(ans=UF.Find(idx[u][v])!=UF.Find(idx[u-1][v])) UF.Union(idx[u][v],idx[u-1][v]); if(opt[0]=='E') if(ans=UF.Find(idx[u][v])!=UF.Find(idx[u][v-1])) UF.Union(idx[u][v],idx[u][v-1]); puts(ans?"TAK":"NIE"); }return 0; }