#include #include #include #include using namespace std; // ????????????N??????1e4+10? const int MAXN = 10000 + 10; // ?????????????????N????????1? const int INF = 0x3f3f3f3f; // ??????????????? int parent[MAXN]; int sz[MAXN]; // DP???dp[x] = ????x??????????? int dp[MAXN]; // ????????????????? vector components; // ?????????+??????????? inline int find(int u) { int root = u; while (parent[root] != root) root = parent[root]; while (parent[u] != root) { int tmp = parent[u]; parent[u] = root; u = tmp; } return root; } // ???????????? inline void unite(int u, int v) { u = find(u), v = find(v); if (u == v) return; if (sz[u] < sz[v]) swap(u, v); parent[v] = u; sz[u] += sz[v]; } // ????????????? inline int read() { int x = 0; char ch = getchar(); while (ch < '0' || ch > '9') ch = getchar(); while (ch >= '0' && ch <= '9') { x = x * 10 + (ch - '0'); ch = getchar(); } return x; } int main() { int N = read(), M = read(); // ?????? for (int i = 1; i <= N; ++i) { parent[i] = i; sz[i] = 1; } // ??M?? for (int i = 0; i < M; ++i) { int u = read(), v = read(); unite(u, v); } // ????????????????????? vector vis(N + 1, false); for (int i = 1; i <= N; ++i) { int root = find(i); if (!vis[root]) { vis[root] = true; components.push_back(sz[root]); } } // ???DP???01??? memset(dp, INF, sizeof(dp)); for (int s : components) { dp[s] = 1; // ?????t=1 } // 01?????????DP for (int s : components) { for (int x = N; x >= s; --x) { if (dp[x - s] != INF) { dp[x] = min(dp[x], dp[x - s] + 1); } } } // ??1~N??????????? for (int i = 1; i <= N; ++i) { if (dp[i] == INF) { printf("-1 "); } else { printf("%d ", dp[i] - 1); // ????? = t-1 } } printf("\n"); return 0; }