AcWing 1250. 格子游戏
原题链接
简单
作者:
ZTEG
,
2019-12-15 21:07:45
,
所有人可见
,
阅读 3340
直接使用并查集好吧
并查集解决的是连通性(无向图联通分量)和传递性(家谱关系)问题,并且可以动态的维护。抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以将点分为若干个集合,每个集合对应图中的一个连通块。
#include<bits/stdc++.h>
using namespace std;
int n,m,a1,a2,t1,t2,flag;
char t;
int book[205][205];
int zx(int x,int y) {
if(book[x][y]==x*n+y)
return book[x][y];
else
return book[x][y]=zx(book[x][y]/n,book[x][y]%n);
}
int main() {
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
book[i][j]=i*n+j;
for(int i=1; i<=m; i++) {
scanf("%d %d %c",&a1,&a2,&t);
if(flag)
continue;
if(t=='D') {
t1=a1+1;
t2=a2;
int c1=zx(a1,a2);
int c2=zx(t1,t2);
if(c1==c2)
flag=i;
else
book[c1/n][c1%n]=c2;
} else {
t1=a1;
t2=a2+1;
int c1=zx(a1,a2);
int c2=zx(t1,t2);
if(c1==c2)
flag=i;
else
book[c1/n][c1%n]=c2;
}
}
if(flag)
cout<<flag<<endl;
else
cout<<"draw"<<endl;
return 0;
}
我觉得直接用点集合来写对于并查集模板更加友好
哥,为啥能这样写,怎么想到的在二维中,原理是什么
如果2个点已经在同一并查集,那么再加上这一条边就会形成一个环