题意
n个点m条边的联通图,k为最小度数,保证其为奇数,问你染色方法使得相邻的点颜色不一样
思路
直接dfs模拟染色,
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=9999+10;
vector<int> g[MAXN];
int k=0;
int ans[MAXN],vis[MAXN];
void dfs(int u)
{
vector<int> vt;
memset(vis,0,sizeof(vis));
for(int i=0;i<g[u].size();i++)
{
int t=g[u][i];
if(ans[t]) vis[ans[t]]=1;
else vt.push_back(t);
}
for(int i=1;i<=k;i++)
{
if(!vis[i])
{
ans[u]=i;
break;
}
}
for(int i=0;i<vt.size();i++)
dfs(vt[i]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
for(int i=0;i<n;i++) g[i].clear();
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u-1].push_back(v-1);
g[v-1].push_back(u-1);
}
k=0;
for(int i=0;i<n;i++)
k=max(k,(int)g[i].size());
if(!(k&1)) k++;
cout<<k<<endl;
memset(ans,0,sizeof(ans));
dfs(0);
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
}
return 0;
}