E - Round Trip(dsu)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Round Trip(dsu)相关的知识,希望对你有一定的参考价值。

E - Round Trip(dsu)

注意到长度 ≥ 4 \\ge 4 4 也就是说只要最少三个其他road点即可。

因为是判断性问题,我们只需要判断S的四周4个点是否存在两个点连通,只要连通显然长度 ≥ 3 \\ge 3 3,因此可以并查集判连通。

时间复杂度: O ( n m ) O(nm) O(nm)

#include <bits/stdc++.h>
#include <atcoder/dsu>
using namespace std;
using namespace atcoder;

int main() 
    int H, W;
    cin >> H >> W;
    vector<char> C(H * W);
    for (char& c : C) 
        cin >> c;
    
    dsu uf(H * W);
    auto id = [&](int i, int j) 
        return i * W + j;
    ;
    for (int i = 0; i < H - 1; ++i) 
        for (int j = 0; j < W; ++j) 
            if (C[id(i, j)] == '.' and C[id(i + 1, j)] == '.') 
                uf.merge(id(i, j), id(i + 1, j));
            
        
    
    for (int i = 0; i < H; ++i) 
        for (int j = 0; j < W - 1; ++j) 
            if (C[id(i, j)] == '.' and C[id(i, j + 1)] == '.') 
                uf.merge(id(i, j), id(i, j + 1));
            
        
    
    int S = 0;
    while (C[S] != 'S') 
        S += 1;
    
    vector<int> around;
    if (S / W != 0) 
        around.push_back(S - W);
    
    if (S / W != H - 1) 
        around.push_back(S + W);
    
    if (S % W != 0) 
        around.push_back(S - 1);
    
    if (S % W != W - 1) 
        around.push_back(S + 1);
    
    for (int x : around) 
        for (int y : around) 
            if (x != y and uf.same(x, y)) 
                cout << "Yes\\n";
                return 0;
            
        
    
    cout << "No\\n";
    return 0;

以上是关于E - Round Trip(dsu)的主要内容,如果未能解决你的问题,请参考以下文章

[Compose] Isomorphisms and round trip data transformations

E - Moat(状压&DSU)

CF 600E. Lomsat gelral(dsu on tree)

Codeforces 600E. Lomsat gelral(Dsu on tree学习)

Codeforces.600E.Lomsat gelral(dsu on tree)

E. Binary Matrix(dsu&滚动)