結果

問題 No.2507 Yet Another Subgraph Counting
ユーザー suisensuisen
提出日時 2023-08-21 04:25:31
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 1,578 bytes
コンパイル時間 960 ms
コンパイル使用メモリ 89,756 KB
実行使用メモリ 13,756 KB
最終ジャッジ日時 2024-05-08 10:07:08
合計ジャッジ時間 5,413 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,756 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 2 ms
6,940 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 2 ms
6,940 KB
testcase_06 AC 2 ms
6,940 KB
testcase_07 AC 2 ms
6,944 KB
testcase_08 AC 2 ms
6,940 KB
testcase_09 AC 2 ms
6,940 KB
testcase_10 AC 2 ms
6,940 KB
testcase_11 AC 3 ms
6,940 KB
testcase_12 AC 2 ms
6,940 KB
testcase_13 AC 2 ms
6,944 KB
testcase_14 AC 397 ms
6,940 KB
testcase_15 AC 2 ms
6,944 KB
testcase_16 AC 2 ms
6,940 KB
testcase_17 AC 102 ms
6,940 KB
testcase_18 AC 2 ms
6,944 KB
testcase_19 AC 2 ms
6,940 KB
testcase_20 AC 2 ms
6,940 KB
testcase_21 AC 2 ms
6,940 KB
testcase_22 TLE -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
testcase_50 -- -
testcase_51 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cassert>
#include <iostream>
#include <utility>
#include <vector>

using vertex = size_t;
using vertex_set = size_t;
using edge = std::pair<vertex, vertex>;

#include <atcoder/dsu>

uint32_t naive(const size_t n, const size_t m, const std::vector<edge> &edges) {
    assert(m < 24);
    using edge_set = size_t;

    std::vector<std::vector<size_t>> cycles(n);
    for (edge_set s = 0; s < 1u << m; ++s) {
        atcoder::dsu uf(n);
        std::vector<size_t> deg(n);
        for (size_t i = 0; i < m; ++i) if ((s >> i) & 1) {
            const auto &[u, v] = edges[i];
            ++deg[u], ++deg[v];
            uf.merge(u, v);
        }
        bool is_cycle = true;
        std::vector<vertex> vs;
        for (vertex v = 0; v < n; ++v) {
            if (deg[v] == 2) vs.push_back(v);
            else is_cycle &= deg[v] == 0;
        }
        for (size_t i = 1; i < vs.size(); ++i) {
            is_cycle &= uf.same(vs[i - 1], vs[i]);
        }
        if (is_cycle) for (vertex v : vs) cycles[v].push_back(s);
    }
    uint32_t ans = 0;
    for (edge_set s = 0; s < 1u << m; ++s) {
        bool ok = true;
        for (vertex v = 0; v < n; ++v) {
            size_t cycle_count = 0;
            for (size_t c : cycles[v]) cycle_count += (c & s) == c;
            ok &= cycle_count <= 1;
        }
        ans += ok;
    }
    return ans;
}

int main() {
    size_t n, m;
    std::cin >> n >> m;
    std::vector<edge> edges(m);
    for (auto &[u, v] : edges) {
        std::cin >> u >> v;
        --u, --v;
    }
    std::cout << naive(n, m, edges) << '\n';
}
0