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;
}

 

posted @ 2024-04-19 11:12  风乐  阅读(27)  评论(0)    收藏  举报