結果
| 問題 | 
                            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