当前位置: 代码迷 >> C语言 >> [原创]图4色问题
  详细解决方案

[原创]图4色问题

热度:467   发布时间:2006-04-14 13:20:00.0
[原创]图4色问题

#include <stdio.h>
#include <string.h>
#define NG 5
typedef int Tgraph[NG][NG]; /*定义二维数组类型Tgraph*/

void fourcolord(Tgraph g,int n,int m,int* sel,int t) {/*递归输出所有结果*/
int i,f;
if(t==n) {
printf("\n->");
for(i=0;i<n;i++) printf("%d ",sel[i]);
}
else {
for(i=1;i<=m;i++) {
*(sel+t)=i;
for(f=0;f<n&&!(g[t][f]&&sel[t]==sel[f]);f++);
if(f==n) fourcolord(g,n,m,sel,t+1);
}
}
}

void fourcolor(Tgraph g,int n,int m) { /*只输出一个结果*/
int i,t=0;
int sel[NG]={0};
while(t>=0) {
if(sel[t]<m) { /*检查赋值越界*/
sel[t++]=++sel[t];
for(i=0;i<n&&!(g[t-1][i]&&sel[t-1]==sel[i]);i++); /*检查邻结点冲突*/
if(i<n) --t; /*冲突退栈*/
else if(t==n) { /*一个可行方案*/
for(i=0;i<n;i++) printf("%d ",sel[i]);
t=-1; /*t=-1退出循环*/
}
}
else --t; /*越界退栈*/
}
}

main() {
Tgraph g={0};
int sel[NG]={0};
g[0][1]=g[1][0]=g[0][2]=g[2][0]=1;
g[0][3]=g[3][0]=g[1][2]=g[2][1]=1;
g[1][3]=g[3][1]=g[1][4]=g[4][1]=1;
g[2][3]=g[3][2]=g[3][4]=g[4][3]=1;
fourcolor(g,NG,4); /*NG为图结点个数,4为可用颜色的数目*/
fourcolord(g,NG,4,sel,0);
}

搜索更多相关的解决方案: int  sel  Tgraph  fourcolord  

----------------解决方案--------------------------------------------------------
高难的 ````
厉害 ``
----------------解决方案--------------------------------------------------------
厉害~~~ 顶~~
----------------解决方案--------------------------------------------------------
会出现什么效果呢?最好截个图什么的
----------------解决方案--------------------------------------------------------
不会吧

怎么在我的机子上运行的结果是这个样子的啊?
1 2 3 4 1
-> 1 2 3 4 1
-> 1 2 3 4 3
不会是这样的吧?
----------------解决方案--------------------------------------------------------
能不能把题目的要求给出,我也想按我的思路编一编
----------------解决方案--------------------------------------------------------
图4色问题是说任何一幅地图都可以只用4种颜色标记区分,如果用图表示就是任何一幅图(有向或无向)无论多少个结点多少条边都可以只用4个颜色加以标记区分(就是任何两个相邻的结点没有相同的颜色,否则冲突)。
我的算法用的是标准的回溯算法,图的存储方式采用矩阵表示,在main函数中定义了图的结构(共5个结点-0 1 2 3 4 ),输出结果:1 2 3 4 1表示对这5个结点的赋值依次为: 1 2 3 4 1号颜色,这样的赋值结果保证了每对相邻的结点都没有相同的颜色。
递归函数可以输出所有可行的方案。
非递归函数只可以输出第一个可行方案(当然也可以全部输出,但这样做没有意义)
图4色问题用标准回溯算法解决效率不高(相当与穷举所有的可能),如果采用前向约束算法(就是每对一个图结点赋一个颜色值就去掉其邻边相应的可行值)或著名的AC-3算法,或者智能回溯算法等可以大大的提高4色问题的解决效率,有时间我就发到上面。

[此贴子已经被作者于2006-4-18 14:24:08编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案