图的着色
worldvanquisher · · 个人记录
我觉得既然你无法预料究竟要考什么那就在考到之前把oiwiki上的所有东西搬到你的博客里,这就是我现在正在做的。
点着色
(无自环无向图)
定义:对无向图的每个节点染
以下用
Brook定理
设连通图不是完全图也不是奇环,则
四色定理
任意平面图都是
Welsh—Powell 算法
一个基于贪心求解图染色方案的算法,要求不限制最大着色数。过程大概是:
- 降序按所有点的度数把点排序。
- 将第一个点染成一个未被使用的颜色。
- 顺次遍历接下来的点,若当前点和所有与第一个点颜色相同的点不相邻,则将该点染成与第一个点相同的颜色。
- 返回第一步。
显然它是
O(n^2) 的。啥你问我有最大限制?建议爆搜。
这代码我还用上吗(口胡了一份应该没什么问题,有问题私我
bool cmp(int a,int b){
return deg[a]>deg[b];
}
void getcolor(){
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
if(!col[i]){
col[i]=++cnt;
for(int j=i;j<=n;j++){
bool jud=false;
for(int k=head[j];k;k=edge[k].next){
if(col[edge[i].v]==cnt){
jud=true;break;
}
}
if(!jud)col[j]=cnt;
}
}
}
}
边着色
类似点着色,对所有边染
Vizing 定理
设
对
这个有的时候有用。
给定一张二分图,左侧有
n 个点,编号为1 到n ,右侧有m 个点,编号为1 到m ,有k 条无向边。给定
c ,你需要将每条边染色为[1,c] 中的一种颜色。现在,对于第i 个点,我们定义它的代价为与i 点相连的边中,出现最多的颜色数减去出现最少的颜色数(如果一种颜色没有出现,我们认为它的出现次数为0 )。你需要构造一种方案,使得每个点的代价和最小,输出代价和方案。
首先根据Vizing定理可以知道这个最小的代价和是度数不为
首先拆点,对于度数为
加入一条边
否则假设