結果
| 問題 | No.317 辺の追加 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-02-03 10:33:44 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,382 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}
vjudge1