1250. 格子游戏(并查集)
题面如下:
https://www.acwing.com/problem/content/1252/
这题需要从点出发,不需要管是红线还是蓝线,划线了就得合并两点到同一集合,只要当前线还未画之前,这两个端点是同一集合,那么画完后就是一个连通块,线组成的集合构成连通意味着成圈了,即得到答案
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N = 210*210;
int n,m;
int p[N];
int find(int x)
{
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
void add(int a,int b)
{
p[find(a)]=find(b);
}
bool same(int a,int b)
{
return find(a)==find(b);
}
int get(int x, int y)
{
return x * n + y;
}
int main()
{
cin >> n >> m;
for(int i=0;i<=n*n;i++)p[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
char op;
cin >> x >> y >> op;
x--,y--;
int p1 = get(x,y);
int p2 = (op == 'D') ? get(x+1,y) : get(x,y+1);
if(find(p1) == find(p2))
{
cout << i << endl;
return 0;
}
add(p1,p2);
}
cout << "draw" << endl;
}