本题为图上DFS+贪心+各种奇妙的优化,差点没把我卡死
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;
vector<int> p[maxn];
int k;
int ans[maxn];
int vis[maxn];
int q[maxn];
int use[maxn];
int ptr[maxn];
int main()
{
int n, m, a, b, r;
int cnt = 0;
std::ios::sync_with_stdio(false);
std::cout.tie(NULL);
std::cin.tie(NULL);
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while (cin >> n >> m)
{
memset(ans, 0, sizeof(ans));
memset(ptr, 0, sizeof(ptr));
memset(use, 0, sizeof(use));
k = 0;
while (m--)
{
cin >> a >> b;
if (ptr[a] == p[a].size())
p[a].push_back(b);
else
p[a][ptr[a]] = b;
if (ptr[b] == p[b].size())
p[b].push_back(a);
else
p[b][ptr[b]] = a;
ptr[a]++;
ptr[b]++;
}
for (int i = 1; i <= n; i++)
{
k = max(k, ptr[i]);
}
k = 2 * (k / 2) + 1;
r = 2;
use[1]=1;
q[1] = 1;
for (int k = 1; k <= n; k++)
{
int i = q[k];
memset(vis, 0, sizeof(int) * (2 + ptr[i]));
for (int j = 0; j < ptr[i]; j++)
{
if (ans[p[i][j]] != 0)
vis[ans[p[i][j]]] = 1;
else if(!use[p[i][j]])
q[r] = p[i][j], r++,use[p[i][j]]=1;
}
for (int j = 1; j <= ptr[i] + 1; j++)
{
if (vis[j] == 0)
{
ans[i] = j;
break;
}
}
}
if (cnt)
std::cout << "\n";
cnt++;
std::cout << k << "\n";
for (int i = 1; i <= n; i++)
{
std::cout << ans[i] << "\n";
}
}
return 0;
}