結果
| 問題 |
No.1983 [Cherry 4th Tune C] 南の島のマーメイド
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2022-03-29 21:28:26 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 204 ms / 4,000 ms |
| コード長 | 1,525 bytes |
| コンパイル時間 | 893 ms |
| コンパイル使用メモリ | 85,760 KB |
| 最終ジャッジ日時 | 2025-01-28 13:17:17 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 41 |
ソースコード
#include <cassert>
#include <cstdint>
#include <iostream>
#include <string>
#include <vector>
#include <atcoder/dsu>
using namespace std;
using i32 = int32_t;
i32 read_int(void) {
i32 v;
cin >> v;
return v;
}
void run(void) {
const i32 n = read_int();
const i32 m = read_int();
const i32 q = read_int();
vector<vector<i32>> g(n);
for (i32 i = 0; i < m; ++i) {
const i32 v = read_int() - 1;
const i32 u = read_int() - 1;
g[v].emplace_back(u);
g[u].emplace_back(v);
}
vector<i32> ord(n, n);
vector<i32> low(n, n);
atcoder::dsu uf(n);
i32 id = 0;
auto dfs = [&](auto self, const i32 v, const i32 p) -> void {
ord[v] = low[v] = id++;
for (auto u: g[v]) {
if (u == p) {
continue;
}
if (ord[u] == n) {
self(self, u, v);
low[v] = min(low[v], low[u]);
if (ord[v] < low[u]) {
uf.merge(v, u);
}
} else {
low[v] = min(low[v], ord[u]);
}
}
};
for (i32 i = 0; i < n; ++i) {
if (ord[i] == n) {
dfs(dfs, i, n);
}
}
vector<string> answer{"No", "Yes"};
for (i32 i = 0; i < q; ++i) {
const i32 s = read_int() - 1;
const i32 t = read_int() - 1;
cout << answer[uf.same(s, t)] << '\n';
}
}
int main(void) {
cin.tie(nullptr);
ios::sync_with_stdio(false);
run();
return 0;
}
akakimidori