直接暴力染色就可以,水题

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1e4;
int n, m, k, du[maxn];
vector<int> g[maxn];
int color[maxn];
bool vis[maxn];

void dfs(int u) {
if (color[u] != -1) return;
for (int i = 1; i <= k; i++) vis[i] = false;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
if (color[v] != -1) vis[color[v]] = true;
}
for (int i = 1; i <= k; i++) if (!vis[i]) { color[u] = i; break; }
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i];
dfs(v);
}
}

int main() {
while (~scanf("%d %d", &n, &m)) {
for (int i = 0; i <= n; i++) g[i].clear();
memset(du, 0, sizeof(du));
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d", &x, &y);
g[x].push_back(y); du[x]++;
g[y].push_back(x); du[y]++;
}
k = 0;
for (int i = 1; i <= n; i++) k = max(k, du[i]);
if (k % 2 == 0) k++;
printf("%d\n", k);
memset(color, -1, sizeof(color));
dfs(1);
for (int i = 1; i <= n; i++) printf("%d\n", color[i]);
printf("\n");
}
return 0;
}