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
CF 600E. Lomsat gelral(dsu on tree)
Codeforces 600E. Lomsat gelral(Dsu on tree学习)