#include #include #include #include using namespace std; const int MAXN = 20; // ????N?20?2^20=1,048,576??? const int INF = 0x3f3f3f3f; vector 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; }