导航:首页 > 源码编译 > 图的染色问题算法

图的染色问题算法

发布时间:2022-11-12 14:26:19

① “四色定理”在实际中有什么应用

四色定理是图的着色问题的一个结果。图的着色本质是给图中的顶点贴标签(labeling),但是要满足一定的条件。“色”只是一种标签。

四色定理的描述虽然提到了地图,但是地图绘制并不需要四色定理:他只要着色,不需要用最少的颜色。实际画地图时一般不用四种颜色。

着色问题的应用,主要排程和分配问题上。
比如我有几个任务,每个任务都需要一天。而我知道其中几样任务是冲突的,不能安排在同一天完成。现在我希望四天完成。这就是四色问题了:所用的图以任务为顶点,冲突的任务间连边,用日期做颜色,对图着色。

再比如我有一些员工,我希望把他们分成四个小组。但是我知道其中几个员工互相之间有矛盾,不能安排在同一组。那么这又是四色问题:所用的图以员工为顶点为,矛盾的员工间连边,用组做颜色,对图着色。

四色定理说:如果上面提到的图是平面图(有高效算法判定),那么可能四天完成/可能分成四组。

② 用4种不同的颜色给图中的圆圈染色,有线段相连的两个圆圈不能同色,一共有多少种不同的染色方法

4×3×3×2
=72(种)
答:一共有72种不同的染色方法.

③ 用c#编码一个图的m-着色问题

给出一个图的m-着色的程序段,回溯法:
/* 图的邻接矩阵Graph[n,n]表示无向连通图G,
1,2,3,..m代表不同的颜色
顶点i所着色用x[i]表示,初始值都赋为0
*/
void NextValue(int k)
{
int j, flag;
do{
x[k] = (x[k]+1) % (m + 1)//分配给x[k]一种新的颜色
if (x[k] == 0)
return; //x[k]的颜色已用完
flag = 1; //x[k]是否可用的标记
for (j = 0; j < n; j++)
if (Graph[k,j] == 1 && x[k] == x[j]){
flag = 0; //x[k]不可用
break;
}
while (flag);
}
void MColoring(int k)
{
while (x[k] < m){ //产生x[k]的合理分配
NextValue(k); //找x[k]的一个合理分配
if (x[k] == 0)
return; //无解,结束调用
if (k == n) { //着完n个顶点,找到完整着色法,输出
Output(x,k) //输出当前解
else
MColoring(k+1)
}
}

/*
递归算法:
void Coloring(区域 n)
1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.
2. 如果ClrSet是空集,返回.
3. 对ClrSet中的每种颜色c,作循环:
3.1 为区域n着色c。
3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.
3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).
4. 把区域n变为没有着色的区域.
--------------------------------------------------------
*/
template<int node_count = 8>
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set<node_type> node_set;
typedef std::vector<color_type> color_array;

public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;

colors_of_nodes.resize(node_count, 0);

total_count = 0;

coloring(0);
}

private:
void coloring(node_type n)
{
// 颜色的使用情况
std::vector<bool> used_colors;

node_type m;
color_type c;

// 初始化颜色的使用情况
used_colors.resize(color_count, false);

// 遍历每个与区域n相邻的区域m
for(m = 0; m < node_count; ++m)
{
if(matrix[n][m])
{
// 获取m的颜色
c = colors_of_nodes[m];
// m已着色
if(c != 0)
used_colors[c] = true;
}
}

// 遍历每个未被n的邻居使用的颜色c
for(c = 1; c < color_count; ++c)
{
if(!used_colors[c])
{
// 为n着色c
colors_of_nodes[n] = c;

// 着色完毕
if(n >= node_count - 1)
{
++total_count;

// 输出结果
_tprintf(_T("---------------------\n"));
_tprintf(_T("Method %d:\n"), total_count);
for(m = 0; m < node_count; ++m)
{
_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]);
}
}
// 还有区域没有着色
else
{
// 为下一个未着色的区域,调用coloring()
coloring(n + 1);
}
}
}

// 将n设置为没有着色的区域
colors_of_nodes[n] = 0;
}

// 0表示无色,1-4表示4种不同颜色
static const int color_count = 5;
// 邻接矩阵
const int (* matrix)[node_count];
// 各区域对应的颜色
color_array colors_of_nodes;
// 总的着色方案数
int total_count;
};

void main()
{
int Matrix[4][4] =
{
{ 0, 1, 0, 0 },
{ 1, 0, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 1, 0 },
};

CColoring<4> coloring;
coloring(Matrix);
}

④ 数学染色问题

郭敦颙回答:

分三种类型进行研究——

当N=9≡0(mod3)时,

当N=10≡1(mod3)时,

当N =11≡2(mod3)时。

三种颜色分别为:A、B、C。

对于N=9≡0(mod3)时染色方式的排列组合的思路,如图

(一)内环的染色方式是ABC循环式,是其它染色方式变化的出发点。

(二)中环内有两种基本类型的染色方式,分别为位于分子和分母的位置

(1)位于分子位置的染色方式是1个A后接着是 BC循环式;

(2)位于分子位置的染色方式是1个A后接着是 BC循环式。

(三)外环内按排有4种变形类型的染色方式,将每一段按逆时针顺序分为4区,每区排列一种染色方式

(1)一区是由BC循环式中的第1个C替换为A;

(2)二区是由CB循环式中的第1个B替换为A;

(3)三区是由BC循环式中的第2个C替换为A;

(4)四区是由CB循环式中的第2个B替换为A;

下面还会有3—6个C和B分别替换为A,

故当N 9时有N-3=9-3=6个C,和6个B被分别替换为A,

共有(3-1)(N-3)=2(N-3)=2N-6种。

(四)未绘图,

(1)由BC循环式中的第1个和第3个共2个C,第1个和第5个共2个C,第3个和第5个共2个C,总计2×3=6种分别替换为A的染色方式。

(2)由CB循环式中的第1个和第3个共2个B,第1个和第5个共2个B,第3个和第5个共2个B,总计2×3=6种分别替换为A的染色方式。

上两项共12种染色方式,

前面提供的是染色方式的排列组合的思路,当N=10≡1(mod3)

和当N =11≡2(mod3)时的排序方式略。




C

B C B C B C

B B B

C C/B B/C C

B B

C B/CA C C/B C

C B B A

B A

C/BC A B/C

C A C C

B B B

A A/A C/B B

A A B/C A C

A B BA

CC

⑤ 小学奥数题:用四种颜色对图中的ABCDE五个区域染色,要求相邻的区域染不同的颜色,有多少种不同的染色方法

由于C跟其他四个区域,都有相邻,首先考虑C
C有4种选择,
A要跟C不同,因此A有3种选择,
D要跟C不同,此时分两种情况:
(1)D和A同色,D有1种选择,C又是另外1种颜色,此时已经出现两种颜色,B和E都可以用剩下的两种颜色(因为B、E不相邻,可以同色)
(2)D和A不同色,D有2种选择,C又是另外1种颜色,此时已经出现三种颜色,B和E都只能用剩下的一种颜色(此时B、E同色)
总计算式:4×3×1×2×2+4×3×2×1×1=72

PS:1楼直接把问题考虑简单了,2楼在考虑如果b和e不一样的时候,b和e可以颜色互换,有两种情况,要再乘以2

⑥ 想问一些离散数学中染色多项式是什么求具体

染色多项式(chromatic polynomial),其实是在图论中的一个概念。
主要是为了解决着名的四色猜想,形成的一个概念。

具体数学史资料如下:

早在1912年,Birkhoff为解决四色猜想,提出了染色多项式(chromatic polynomial)[14-15]的概念。染色多项式的基本思想是:用给定的若干种颜色对给定的图进行染色,有多少种染色方法?

图G的染色多项式记为P(G, x),它表示用不超过x种颜色对图染色的方法数。对于一个整数k,若P(G, k) = 0,则表示图G不可能仅用k种颜色染色。染色多项式与顶点染色问题有着密切的关系,图的色数(chromatic number)实际上是使得其染色多项式取非0值的最小正整数,因此如果求出了一个图的的染色多项式,那么图的色数也容易求出来。

用染色多项式研究顶点染色问题的一个好处是:可以利用比较成熟的代数工具处理图论问题。数学家们对染色多项式进行了大量的研究,并取得了不少研究成果,如着名的缩边原理,利用此原理可求出一般图的染色多项式,关于缩边原理将在后面详述。

另外,顶点染色问题是一个典型的NP−hard问题,现在与此相关的一个重大问题就是:P =? NP问题,多数数学家倾向于认为P ≠NP,但这个问题在理论上远未得到解决[16-18]。从理论上完全解决顶点染色问题现在看来过于困难,到目前为止还没有很好的解决NP−hard问题的方法。

尽管数学家已经取得了不少成果,但就本质而言,理论上并没有什么实质性的进展。由于工程及实际应用的需要,世界各地的数学家、工程师进行了大量有关顶点染色问题的算法研究。如今,大量的近似算法已经被提出来,而效率较高的精确求解算法却不多。

在近似算法方面,最简单的一种是颜色编号最小优先算法,这种算法每次选择编号最小的可用颜色对一个点染色,然而这种算法并不能给出精确解,甚至在多数情况下其近似解与精确解相差甚远。此外,数学家利用现在流行的算法工具如遗传算法、启发式算法、分布式算法等研究顶点染色问题,提出了各式各样的近似算法。

如Brelaz提出了一种遗传算法,被称作Brelaz Coloring,这种算法可以给出一个很好的近似解。然而,上述所有近似算法均不能得到精确解。在某些实际问题中,精度较高的近似解已经足够应用了。这可能也就是大量的近似算法被提出的原因。在精确算法方面,进展不如近似算法的研究。其中一种比较直观的是所谓brute−force search算法,这种算法将已知的k种颜色分配给n个顶点,它需要对所有的kn种情况判断是否可行,因而其算法复杂度为O(kn)。

最近Malaguti等人提出了一种Branch and Price算法[21],这种算法在一种遗传算法的基础上改进而得到,能解决的图顶点数也限于几百以内。在精确算法复杂度方面,现在最好的结果也限于指数级。如k-可染色问题(k-colorability)的算法复杂度为O(2nn),特别的k = 3或4时,目前最好的算法其复杂度分别为O(1.3289n) 和O(1.7504n)。

⑦ 图着色问题的路线着色问题

道路着色问题(Road Coloring Problem)是图论中最着名的猜想之一。通俗的说,这个猜想认为,可以绘制一张“万能地图”,指导人们到达某一目的地,不管他们原来在什么位置。这个猜想最近被以色列数学家艾夫拉汉· 特雷特曼(Avraham Trahtman)在2007年9月证明。
举个例子。在维基网给出的图例中,如果按图中所示方式将16条边着色,那么不管你从哪里出发,按照“蓝红红蓝红红蓝红红”的路线走9步,你最后一定达到黄色顶点。路线着色定理就是说在满足一定条件的有向图中,这样的着色方式一定存在。严格的数学描述如下。我们首先来定义同步着色。G是一个有限有向图并且G的每个顶点的出度都是k。G的一个同步着色满足以下两个条件:1)G的每个顶点有且只有一条出边被染成了1到k之间的某种颜色;2)G的每个顶点都对应一种走法,不管你从哪里出发,按该走法走,最后都结束在该顶点。有向图G存在同步着色的必要条件是G是强连通而且是非周期的。一个有向图是非周期的是指该图中包含的所有环的长度没有大于1的公约数。路线着色定理这两个条件(强连通和是非周期)也是充分的。也就是说,有向图G存在同步着色当且仅当G是强连通而且是非周期的。
特雷特曼在数学上的这一成果极为令人瞩目,英国《独立报》为此事专门发表了一篇题为“身无分文的移民成了数学超级明星”的文章,给予了高度的评价。
以色列人也为特雷特曼取得的成就感到无比的骄傲。特拉维夫电视台中断了正常的节目播放,以第一时间发布了这一重大消息,连中东其他国家的主流媒体也作了大篇幅的相关报道。
得知特雷特曼解决这一难题的消息后,多年从事路线着色问题研究的加拿大数学家乔尔·弗里德曼说,“路线着色问题的解决令数学共同体非常兴奋。”读过特雷特曼论文的中国数学家和语言学家周海中教授认为,特雷特曼的数学知识非常渊博,解题方法十分巧妙,这一谜题得到破解,无疑是数学史上的一个华彩乐章。 算法描述:color[n]存储n个顶点的着色方案,可以选择的颜色为1到m。
当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。否则,依次对顶点t着色1-m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。 #include<stdio.h>intcolor[100];boolok(intk,intc[][100])//判断顶点k的着色是否发生冲突{inti,j;for(i=1;i<k;i++){if(c[k][i]==1&&color[i]==color[k])returnfalse;}returntrue;}voidgraphcolor(intn,intm,intc[][100]){inti,k;for(i=1;i<=n;i++)color[i]=0;k=1;while(k>=1){color[k]=color[k]+1;while(color[k]<=m)if(ok(k,c))break;elsecolor[k]=color[k]+1;//搜索下一个颜色if(color[k]<=m&&k==n){for(i=1;i<=n;i++)printf(%d,color[i]);printf( );}elseif(color[k]<=m&&k<n)k=k+1;//处理下一个顶点else{color[k]=0;k=k-1;//回溯}}}voidmain(){inti,j,n,m;intc[100][100];//存储n个顶点的无向图的数组printf(输入顶点数n和着色数m: );scanf(%d%d,&n,&m);printf(输入无向图的邻接矩阵: );for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf(%d,&c[i][j]);printf(着色所有可能的解: );graphcolor(n,m,c);} 利用相交图(interference graph)来表示程序变量的生命期是否相交,将寄存器分配给变量的问题,可以近似地看成是给相交图着色:相交图中,相交的节点不能着同一颜色;每一种颜色对应一个寄存器。Chaitin等人最早提出了基于图着色的寄存器分配方法其着色思路采用了Kempe的着色方法,即,任意一个邻居节点数目少于k的节点,都能够被k着色。判断一个图是否能够被k(k>=3)种颜色着色,即k着色问题,被Karp证明是一个NP-complete问题。
但是,寄存器分配不仅仅是图着色的问题。当寄存器数目不足以分配某些变量时,就必须将这些变量溢出到内存中,该过程成为spill。最小化溢出代价的问题,也是一个NP-complete问题。如果简化该问题——假设所有溢出代价相等,那么最小化溢出代价的问题,等价于k着色问题,仍然是NP-complete问题。
此外,如果两个变量的生命期仅仅因为出现在同一个拷贝指令中而相邻,那么,通过将这两个变量分配到同一个寄存器,就可以消除该拷贝指令,成为coalescing。这个方向的努力在Chaitin的文章以后的1/4个世纪,成为推动寄存器分配的主要动力之一,涌现出了包括aggressive coalescing,conservative coalescing和optimistic coalescing。但是,将两个变量分配到同一个寄存器,等价于将这两个变量合并成同一个变量,生命期合并,因而会加剧相交图的聚簇现象,降低相交图的可着色性。Bouchez等人证明了目前的coalescing问题都是NP-complete的。
为了降低相交图的聚簇现象,提高相交图的可着色性,可以通过将变量拷贝给一个临时变量,并将以后对该变量的使用替换成对该临时变量的使用,从而将一个变量的生命期分解成两个变量的生命期,称为live range splitting。显然,这是一个与coalescing的作用相反的过程。Bouchez等人考虑了该方法的复杂度。
此外,寄存器分配还需要考虑寄存器别名(aliasing)和预着色(pre-coloring)的问题。寄存器别名是指,在某些体系结构中,一个寄存器的赋值可能会影响到另外一个寄存器。比如,在x86中,对AX寄存器的赋值,会影响AL和AH寄存器。预着色是指,某些变量必须被分配到特定的寄存器。比如,许多体系结构会采用特定寄存器来传递函数参数。
George和Appel发展了Chaitin的算法,更好地考虑了coalescing过程和赋值过程,以及各过程之间的迭代,在基于图着色的寄存器分配方法中具有广泛的影响。

⑧ 奥数…用红、黄、蓝三种颜色对下图进行染色,要求相邻两块区域颜色不相同,共有多少种染色方法

应该有6种,按ABCD的顺序,有红黄红蓝、红黄红黄、红黄蓝黄、红蓝黄蓝、黄蓝黄蓝、红蓝红蓝。

⑨ 小学五年级奥数染色问题

楼上的答案值得商榷。至少我没有看懂他在说什么。

这应该算是五年级的奥数里较难的题了。记得当初小学时,染色问题一直比较弱。现在依然如此,以至于这两题花了我较长的时间。

1、首先,说思路。既然题目已经告诉你要染色了,那其实就限制了思考范围,从而降低了难度。题目中最关键的是你要看见“往右”或“往上”本质是一样的,非常对称。但是“往左下”就不一样了。为什么这么说?因为考虑一下最普通的黑白相隔的染色方案,“往右”或“往上”都能保证每走一步会经过不同颜色的方格,但是“往左下”则保证每走这样一步都会经过相同颜色的方格。所以,他们是不同的。所以,从直觉上判断这里应该是本题的关键所在。

那么,怎么利用这一性质呢?其实问题没有那么复杂,所以不需要考虑太多的方法(我一开始就因为在几种不同的方案上徘徊导致了浪费时间)而只要直接考虑最普通的方案,即找一染色方案保证每走一步(不论是往右或往上或往左下)都会经过不同颜色的方格。

这样,目标其实很清楚了。我们需要三色去染这8*8的方格。如图。至于如何得到此图的染色过程其实不难,只要考虑对角线必须保证不同的颜色,然后又需要三色,这样依次“蓝黑白”地去染每条对角线,然后对于不同的对角线只需要保证相邻的对角线的染色正好错开了一格即可。

然后,就有这样的思考。出发点不算我们要经过63格,既然每步都会经过不同颜色的方格,而且从左上角的蓝色格出发正好经过了蓝黑白三色各21格(出发点的蓝色不算)正好能够走完,但是从左下角的黑色格出发会经过蓝22格,黑20格,白21格,而且是走不完的。那么这时自然地我们就会考虑如果能够保证“每三步”(任意的)正好经过了蓝黑白三色,那么的确从左下角出发是到达不了的,因为如果能保证“每三步”都经过了蓝黑白三色,那总共的63步就会保证经过蓝黑白三色各21次,但是显然从右下角出发经过的蓝黑数不同。矛盾。另一方面,从左上角的确保证了经过蓝黑白各21次,而且也的确能遍历。

所以,我们就想到是否能够保证“每三步”(任意的)正好经过了蓝黑白三色(顺序不一定)呢?答案是肯定的。原因从图上观察便知。要到达每一黑色格子唯一的方法是通过一白色的格子,而要到达任何的白色的格子只有通过蓝色的格子,而要到达蓝色的格子只有通过黑色的格子,这样循环。所以任何的三步都经过正好三色。从而63步经过三色各21次。与要经过蓝22格,黑20格,白21格矛盾,所以无法遍历。

阅读全文

与图的染色问题算法相关的资料

热点内容
kotlin编译为native 浏览:138
家用编译机 浏览:547
电子加密货币最新政策 浏览:379
androidcanvas撤销 浏览:269
安卓手机怎么把图标全部下移 浏览:185
饥荒被服务器踢出怎么进 浏览:170
c编译器哪款好 浏览:732
快手宝哥发明什么app 浏览:822
张艳玲编译 浏览:66
android展开收起动画 浏览:237
linuxxz文件 浏览:160
在游戏中心里面怎么玩到解压神器 浏览:484
电脑发到手机里面照片怎么解压 浏览:74
虚拟pdf打印机64位 浏览:413
支付宝AES加密和解密 浏览:379
编译实验原理下载 浏览:131
加密防伪溯源系统私人定做 浏览:222
扫码给电动车充电的app叫什么 浏览:760
关闭命令提醒 浏览:356
云账本app服务器 浏览:500