Submission #1114558

#TimeUsernameProblemLanguageResultExecution timeMemory
1114558vjudge1Newspapers (CEOI21_newspapers)C++17
12 / 100
222 ms524288 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, M;
    std::cin >> N >> M;

    std::vector<std::vector<int>> gr(1 << N);
    for (int i = 0; i < M; ++i) {
        int A, B;
        std::cin >> A >> B;
        --A, --B;
        gr[A].emplace_back(B);
        gr[B].emplace_back(A);
    }

    std::vector<std::vector<std::pair<int, int>>> adj(1 << N);

    std::vector<int> dp(1 << N, -1), vis(1 << N);
    std::vector<std::pair<int, int>> save(1 << N);
    dp[0] = 0;
    auto dfs = [&](auto&& self, int mask) -> void {
        if (vis[mask]) {
            return;
        }
        vis[mask] = true;
        for (int i = 0; i < N; ++i) {
            int nmask = 0;
            for (int j = 0; j < N; ++j) {
                if (mask >> j & 1 && i != j) {
                    for (auto u : gr[j]) {
                        nmask |= (1 << u);
                    }
                }
            }
            debug(mask, nmask);
            adj[nmask].emplace_back(mask, i);
            self(self, nmask);
        }
    };
    dfs(dfs, (1 << N) - 1);

    std::vector<int> dep((1 << N), -1);
    std::vector<std::pair<int, int>> bef((1 << N));
    std::queue<int> que;
    que.emplace(0);
    dep[0] = 0;
    while (!que.empty()) {
        int v = que.front();
        que.pop();
        for (auto[u, i] : adj[v]) {
            if (dep[u] == -1) {
                dep[u] = dep[v] + 1;
                bef[u] = {v, i};
                que.emplace(u);
            }
        }
    }

    int ans = dep[(1 << N) - 1];

    if (ans == -1) {
        std::cout << "NO\n";
    } else {
        std::cout << "YES\n";
        std::cout << ans << '\n';
        int mask = (1 << N) - 1;
        while (mask != 0) {
            std::cerr << std::bitset<10>(mask) << '\n';
            std::cout << bef[mask].second + 1 << ' ';
            mask = bef[mask].first;
        }
        std::cout << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...