[bzoj4423] [AMPPZ2013]Bytehattan

本文探讨如何使用并查集解决在特定数据范围内遇到的联通性问题,通过将原始网格图转化为对偶图,将边的删除问题转化为边的连接问题,从而简化判断过程。详细步骤包括读取输入数据、定义并查集操作函数,并通过实例代码演示解决方案。

  看到数据范围被吓傻了。

  根据题解可得。。我们把原来的网格图转成它的对偶图。。。删边就变成了连边,判联通就变成判不联通了。。

  联通什么的自然就用并查集了。。。

  具体细节的话还是自己画图靠谱多了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int maxn=1504;
 6 int fa[maxn*maxn];
 7 int i,j,k,n,m,last,n1,sm,q,x,y,x1,y1;
 8 char s1[3],s[3];
 9  
10 int ra;char rx;
11 inline int read(){
12     rx=getchar(),ra=0;
13     while(rx<'0'||rx>'9')rx=getchar();
14     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
15 }
16  
17 inline int getfa(int x){
18     return fa[x]!=x?fa[x]=getfa(fa[x]):x;
19 }
20 inline void run(int x,int y,char id){
21     int a=x*n1+y+1,b=a-(id=='N'?n1:1);
22     x=getfa(a),y=getfa(b);
23     if(x==y)puts("NIE"),last=0;else fa[x]=y,puts("TAK"),last=1;
24 }
25 int main(){
26     n=read(),q=read();
27     n1=n+1,sm=n1*n1;
28     for(i=1;i<=sm;i++)fa[i]=i;
29     for(i=1;i<=n1;i++)fa[i]=fa[i*n1]=fa[i*n1+1]=fa[sm-i]=1;
30     last=1;
31     while(q--){
32         x=read(),y=read(),scanf("%s",s),x1=read(),y1=read(),scanf("%s",s1);
33         if(last==1)run(x,y,s[0]);else run(x1,y1,s1[0]);
34     }
35     return 0;
36 }
View Code

 

转载于:https://www.cnblogs.com/czllgzmzl/p/5301715.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值