题意:在一个n个点的无向连通图中,n是奇数,k是使得所有点的度数不超过k的最小奇数,询问一种染色方案,使得相邻点的颜色不同。

题解:一个点和周围的点的颜色数加起来最大为它的度数+1;如果最大度数是偶数,那么k种颜色一定够了。如果最大度数是奇数,而且n是奇数,那么k种颜色也一定是足够的。 可以反证,最大度数的点是u,deg[u]是奇数,而且和u相邻的点颜色各不相同,那么与u的一个相邻点v,至少和deg[u]个颜色不同的点相邻,这样构造出来连通图点数一定是偶数,和n是奇数是矛盾的,所以不会出现颜色数为deg[u]+1的情况。

所以只要染色就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
const int maxm = 2e5+; int head[maxn],to[maxm],nxt[maxm],col[maxn],ecnt,deg[maxn];
int vis[maxn]; void addEdge(int u,int v)
{
deg[u]++;
to[ecnt] = v;
nxt[ecnt] = head[u];
head[u] = ecnt++;
}
int k; void dfs(int u)
{
for(int i = head[u]; ~i; i= nxt[i]){
vis[col[to[i]]] = u;
} for(int i = ; i <= k; i++) if(vis[i] != u) { col[u] = i; break; } for(int i = head[u]; ~i; i= nxt[i]){
if(col[to[i]]) continue;
dfs(to[i]);
}
} int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(~scanf("%d",&n)){
scanf("%d",&m);
memset(head+,-,sizeof(int)*n);
memset(deg+,,sizeof(int)*n);
memset(col+,,sizeof(int)*n);
ecnt = ;
while(m--){
int u,v;
scanf("%d %d",&u,&v);
addEdge(u,v); addEdge(v,u);
} k = (*max_element(deg+,deg++n))|;
memset(vis+,,sizeof(int)*k); dfs();
printf("%d\n",k);
for(int i = ; i <= n; i++) printf("%d\n",col[i]);
putchar('\n');
}
return ;
}

最新文章

  1. 基于Quartz.NET构建自己的动态作业调度器
  2. KVM 虚拟化 初体验
  3. JS 去字符串空格 总结
  4. JS回调函数(callback)
  5. JS 学习笔记--4---运算符
  6. 关于javascript中的 执行上下文和对象变量
  7. 让IE6下支持固定定位
  8. CSU1326+背包+并查集
  9. 【暑假】[实用数据结构]KMP
  10. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
  11. HDU 1059 Dividing(多重背包)
  12. 【Linux】linux经常使用基本命令
  13. fltk demo
  14. hdu 4704 同余定理+普通快速幂
  15. CDMA sid, nid, bid 含义解释
  16. Composer - windows下安装方法
  17. JavaScript手工编写滚动条组件
  18. boot+Xss防攻击的处理方案
  19. 我的AI之路
  20. VUE 利用webpack 给生产环境和发布环境配置不同的接口地址

热门文章

  1. 如何在 Swoole 中优雅的实现 MySQL 连接池
  2. C++11/14的新特性——更简洁
  3. 数据库路由中间件MyCat - 源代码篇(12)
  4. Lightoj1028【计算约数个数】
  5. [openjudge] 1455:An Easy Problem 贪心
  6. 51nod1241(连续上升子序列)
  7. 能量项链 洛谷P1063
  8. 搭建Windows IIS(Internet Information Server)服务器
  9. blur和focus的运用
  10. ES6新特性使用小结(五)