博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 1613 K-Graph Oddity K度图着色 (构造)
阅读量:6995 次
发布时间:2019-06-27

本文共 1434 字,大约阅读时间需要 4 分钟。

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

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

所以只要染色就好了。

#include
using namespace std;const int maxn = 1e4;const int maxm = 2e5+5;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 = 1; 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+1,-1,sizeof(int)*n); memset(deg+1,0,sizeof(int)*n); memset(col+1,0,sizeof(int)*n); ecnt = 0; while(m--){ int u,v; scanf("%d %d",&u,&v); addEdge(u,v); addEdge(v,u); } k = (*max_element(deg+1,deg+1+n))|1; memset(vis+1,0,sizeof(int)*k); dfs(1); printf("%d\n",k); for(int i = 1; i <= n; i++) printf("%d\n",col[i]); putchar('\n'); } return 0;}

 

转载于:https://www.cnblogs.com/jerryRey/p/4702323.html

你可能感兴趣的文章
图片占位
查看>>
bs4 python解析html
查看>>
Hive篇---Hive与Hbase整合
查看>>
WPF系列:GridView列绑定控件(一)
查看>>
Eclipse常用快捷键
查看>>
个人项目博客----移山小分队----02
查看>>
完成构建之法第二章后面的小实践~
查看>>
java中的继承(二)
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
坑爹的 ld: symbol(s) not found for architecture armv7
查看>>
Help Jimmy 递推动规
查看>>
Kali渗透测试——netdiscover
查看>>
数据结构之拓扑排序
查看>>
Java基本语法(一)
查看>>
zedboard 初使用 -- 工具篇
查看>>
关于Spring出现"COMMIT/AUTO or remove 'readOnly' marker from transaction definition."的解决办法...
查看>>
web请求报出 “超过了最大请求长度”
查看>>
Java中构造方法、实例方法、类方法的区别
查看>>
字节流转换为对象的方法
查看>>
2018-2019-1 20165226 《信息安全系统设计基础》第1周学习总结
查看>>