UVA1613 K度图的着色 K-Graph Oddity(图的着色)
题意:
给出一个结点数为奇数的无向图. 根据定义, 一个结点的度数即为它连接边的条数. 在给出的图中每一个结点的度数都不超过一个最小奇数 k. 你需要使用最多 k 种不同的颜色为图着色, 使得每个相邻结点的颜色都不同
思路:
dfs:先染当前节点再染其子节点,自底向下
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int t,n,m,he,vis[maxn],col[maxn],du[maxn];
vector<int>mp[maxn];
//先染当前节点再染其子节点,自底向下
void dfs(int x){
for(int i=0;i<mp[x].size();i++){
int y=mp[x][i];
if(col[y]) vis[col[y]]=x;
}
for(int i=1;i<=he;i++){
if(vis[i]!=x){
col[x]=i;
break;
}
}
for(int i=0;i<mp[x].size();i++){
int y=mp[x][i];
if(!col[y])dfs(y);
}
}
int main(){
while(~scanf("%d%d",&n,&m)){
he=0;
memset(du,0,sizeof(du));
memset(col,0,sizeof(col));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)mp[i].clear();
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
du[x]++;
du[y]++;
he=max(he,max(du[x],du[y]));
}
if(he%2==0)he++;
dfs(1);
printf("%d\n",he);
for(int i=1;i<=n;i++){
printf("%d\n",col[i]);
}
printf("\n");
}
}