| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 810 人关注过本帖
标题:[原创]图4色问题
只看楼主 加入收藏
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
 问题点数:0 回复次数:6 
[原创]图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 
2006-04-14 13:20
え元元え
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2006-4-7
收藏
得分:0 
高难的 ````
厉害 ``

2006-04-14 13:29
oo︶ㄣ枕头
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-4-10
收藏
得分:0 
厉害~~~ 顶~~
2006-04-14 14:04
渔火
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-3-19
收藏
得分:0 
会出现什么效果呢?最好截个图什么的
2006-04-14 19:41
疯狂VC
Rank: 1
等 级:新手上路
威 望:1
帖 子:375
专家分:0
注 册:2006-3-29
收藏
得分:0 
不会吧

怎么在我的机子上运行的结果是这个样子的啊?
1 2 3 4 1
-> 1 2 3 4 1
-> 1 2 3 4 3
不会是这样的吧?

2006-04-15 02:17
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
得分:0 
能不能把题目的要求给出,我也想按我的思路编一编
2006-04-15 12:33
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
图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编辑过]


要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2006-04-18 14:18
快速回复:[原创]图4色问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034964 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved