結果

問題 No.317 辺の追加
コンテスト
ユーザー vjudge1
提出日時 2026-02-03 10:33:44
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
結果
WA  
実行時間 -
コード長 2,382 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 637 ms
コンパイル使用メモリ 69,592 KB
実行使用メモリ 8,912 KB
最終ジャッジ日時 2026-02-03 10:33:52
合計ジャッジ時間 7,598 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample WA * 2
other RE * 38
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 20;          // ????N?20?2^20=1,048,576???
const int INF = 0x3f3f3f3f;
vector<int> g[MAXN];          // ????0~N-1?
bool dp_conn[1 << MAXN];      // ???DP?dp_conn[mask]??mask????
int dp_k[1 << MAXN];          // ??????DP?dp_k[mask]??mask????????

// ??????DP???????DP
void solve_dp(int N) {
    int full_mask = (1 << N) - 1;
    // ??????????DP
    memset(dp_conn, false, sizeof(dp_conn));
    for (int u = 0; u < N; ++u) {
        dp_conn[1 << u] = true; // ????
    }
    // ????mask??mask????1????????
    for (int mask = 1; mask <= full_mask; ++mask) {
        if (__builtin_popcount(mask) == 1) continue; // ??????
        // ????u?mask?????1
        int u = __builtin_ctz(mask); // ?????????0????????1????
        // ??u???v
        for (int v : g[u]) {
            if (mask & (1 << v)) { // v?mask?
                if (dp_conn[mask ^ (1 << v)]) { // ??v?????mask??
                    dp_conn[mask] = true;
                    break;
                }
            }
        }
    }

    // ?????????????DP
    memset(dp_k, INF, sizeof(dp_k));
    for (int u = 0; u < N; ++u) {
        dp_k[1 << u] = 1; // ????????1
    }
    // ????mask??mask???????
    for (int mask = 1; mask <= full_mask; ++mask) {
        if (__builtin_popcount(mask) == 1) continue;
        // ??mask???s??????u??s????????
        int u = __builtin_ctz(mask);
        for (int s = (mask - 1) & mask; s; s = (s - 1) & mask) {
            if ((s & (1 << u)) && dp_conn[s]) { // ?????+?????????
                dp_k[mask] = min(dp_k[mask], dp_k[s] + dp_k[mask ^ s]);
            }
        }
    }
}

int main() {
    int N, M;
    while (scanf("%d%d", &N, &M) == 2) { // ?????N???M???????
        // ?????
        for (int i = 0; i < N; ++i) g[i].clear();
        // ??M???1~N?0~N-1
        for (int i = 0; i < M; ++i) {
            int u, v;
            scanf("%d%d", &u, &v);
            u--; v--;
            g[u].push_back(v);
            g[v].push_back(u); // ????????
        }

        // ??DP???????k
        solve_dp(N);
        int full_mask = (1 << N) - 1;
        int k = dp_k[full_mask];

        // ??1~N???
        for (int i = 1; i <= N; ++i) {
            if (i > k) printf("-1 ");
            else printf("%d ", k - i);
        }
        printf("\n");
    }
    return 0;
}
0