1. 程式人生 > >[BZOJ4423][AMPPZ2013]Bytehattan(對偶圖+並查集)

[BZOJ4423][AMPPZ2013]Bytehattan(對偶圖+並查集)

har mes fin const rep amp 直接 include namespace

建出對偶圖,刪除一條邊時將兩邊的格子連邊。一條邊兩端連通當且僅當兩邊的格子不連通,直接並查集處理即可。

 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 }

[BZOJ4423][AMPPZ2013]Bytehattan(對偶圖+並查集)