图的M着色算法演示
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int OK(int t,int i) { int j;
for( j=1;j<t;j++) {
if(a[t][j]&&x[j]==i)
return 0; }
return 1; }
t=2
t=3 t=4
模拟演示
t=1
当前节 点
颜色的 种类
void Backtrace(int t,int m)
当搜索的当前节点t<=N时,m种颜色 依次试用,调用函数OK进行判断。 如果当前颜色可以,则进入下一层搜索。
当搜索到最叶子节 点时(t>N),即 可输出一种方案
for( i=1;i<=m;i++) {
if(OK(t,i)) { x[t]=i;
Backtrace(t+1,m); }
}
if(t>N) {
sum++; printf("第%d种方案:\n",sum);
for( i=1;i<=N;i++) printf("%d ",x[i]); }
我们可以把问题简化为3个点来分析,现给定如下图 ,怎样求解呢?
1
该图的色数是多少?怎样 用解空间树来表示呢?
3 2
由图可知,对于每一个顶点可选的颜色可以有3种不同的选择,所以每一个 节点有3个儿子节点,有4层。
判断条件是什么?
新加入来得节点t取某一种颜色i时,依次和上层的每一个节点j(j<t)比较。 如果a[t][j]=1并且x[t]=x[j],那么它是不可着色的。
四、程序代码
#include<stdio.h> #include<string.h> #define N 3//图中节点的个数 int a[N+1][N+1]={
0,0,0,0, 0,1,1,1, 0,1,1,1, 0,1,1,1, };//邻接矩阵 int x[N+1];//记录颜色 int sum=0;//保存可以着色的方案数 int OK(int t,int i)//判断函数 { int j; for( j=1;j<t;j++) { if(a[t][j]&&x[j]==i) return 0; } return 1; }
运行结果
当N=5时,色数又是多少呢?
N =5时的子集树
X[1]=1 X[1]=2 X[1]=3 X[1]=4 X[2]=1 2 3 4
X[3]=1 2 3 4
X[4]=1 X[5]=1
谢谢大家的观看!
谢谢观赏!
图的m着色问题
讲课 : 吴双燕 PPT制作 : 谭晓雅
目录
一
问题产生的背景
二
问题描述
三
算法设计与分析
四
程序运行及结果
一、产生背景
图的着色问题是由地图的着色问题引申而来的,用 m种颜色为地图着色,使得地图上的每一个区域着 一种颜色,且相邻区域颜色不同。
二、问题描述
给定无向连通图G和m种不同的颜色。用这些颜色为图G 的各顶点着色,每个顶点着一种颜色。是否有一种着色法 使G中每条边的2个顶点着不同颜色。如果有则称这个图 是m可着色,否则称这个图不是m可着色。若一个图最少 需要k种颜色才能使图中每条边连接的2个顶点着不同颜 色,则称这个数k为该图的色数。
Hale Waihona Puke void Backtrace(int t,int m) {
int i; if(t>N)//算法搜索至叶子节点 {
sum++; printf("第%d种方案:\n",sum); for( i=1;i<=N;i++)
printf("%d ",x[i]); printf("\n"); } else { for( i=1;i<=m;i++) {
三、算法设计
输入:颜色种类m 输出:如果这个图不是m可着 色,给出否定回答;如果这个图是m可着色的,找出所有 不同的着色法。
思考?
如何将给定的 无向图存储在 计算机中?
1
2 3
5 4
可以用一下邻接矩阵来表示
11110 11111 11110 11111 01011
邻接矩阵中通常用二维数组来存放边之间的关系,用一 维数组来存放顶点的信息。所以在接下来的求解问题中 我们将用到二维数组a来存放两边是否相邻,用一维数组 x来存放每个顶点的颜色;x[i]=j表示第i个节点图第j中颜色。
if(OK(t,i)) { x[t]=i;
Backtrace(t+1,m); } } } }
int main() {
int m; int i; printf("请输入颜色种类:\n"); scanf("%d",&m); for(i=1;i<=m;i++)//初始化 x[i]=0; Backtrace(1,m); if(sum==0) { printf("不是%d可着色的!\n",m); } return 0; }
for( j=1;j<t;j++) {
if(a[t][j]&&x[j]==i)
return 0; }
return 1; }
t=2
t=3 t=4
模拟演示
t=1
当前节 点
颜色的 种类
void Backtrace(int t,int m)
当搜索的当前节点t<=N时,m种颜色 依次试用,调用函数OK进行判断。 如果当前颜色可以,则进入下一层搜索。
当搜索到最叶子节 点时(t>N),即 可输出一种方案
for( i=1;i<=m;i++) {
if(OK(t,i)) { x[t]=i;
Backtrace(t+1,m); }
}
if(t>N) {
sum++; printf("第%d种方案:\n",sum);
for( i=1;i<=N;i++) printf("%d ",x[i]); }
我们可以把问题简化为3个点来分析,现给定如下图 ,怎样求解呢?
1
该图的色数是多少?怎样 用解空间树来表示呢?
3 2
由图可知,对于每一个顶点可选的颜色可以有3种不同的选择,所以每一个 节点有3个儿子节点,有4层。
判断条件是什么?
新加入来得节点t取某一种颜色i时,依次和上层的每一个节点j(j<t)比较。 如果a[t][j]=1并且x[t]=x[j],那么它是不可着色的。
四、程序代码
#include<stdio.h> #include<string.h> #define N 3//图中节点的个数 int a[N+1][N+1]={
0,0,0,0, 0,1,1,1, 0,1,1,1, 0,1,1,1, };//邻接矩阵 int x[N+1];//记录颜色 int sum=0;//保存可以着色的方案数 int OK(int t,int i)//判断函数 { int j; for( j=1;j<t;j++) { if(a[t][j]&&x[j]==i) return 0; } return 1; }
运行结果
当N=5时,色数又是多少呢?
N =5时的子集树
X[1]=1 X[1]=2 X[1]=3 X[1]=4 X[2]=1 2 3 4
X[3]=1 2 3 4
X[4]=1 X[5]=1
谢谢大家的观看!
谢谢观赏!
图的m着色问题
讲课 : 吴双燕 PPT制作 : 谭晓雅
目录
一
问题产生的背景
二
问题描述
三
算法设计与分析
四
程序运行及结果
一、产生背景
图的着色问题是由地图的着色问题引申而来的,用 m种颜色为地图着色,使得地图上的每一个区域着 一种颜色,且相邻区域颜色不同。
二、问题描述
给定无向连通图G和m种不同的颜色。用这些颜色为图G 的各顶点着色,每个顶点着一种颜色。是否有一种着色法 使G中每条边的2个顶点着不同颜色。如果有则称这个图 是m可着色,否则称这个图不是m可着色。若一个图最少 需要k种颜色才能使图中每条边连接的2个顶点着不同颜 色,则称这个数k为该图的色数。
Hale Waihona Puke void Backtrace(int t,int m) {
int i; if(t>N)//算法搜索至叶子节点 {
sum++; printf("第%d种方案:\n",sum); for( i=1;i<=N;i++)
printf("%d ",x[i]); printf("\n"); } else { for( i=1;i<=m;i++) {
三、算法设计
输入:颜色种类m 输出:如果这个图不是m可着 色,给出否定回答;如果这个图是m可着色的,找出所有 不同的着色法。
思考?
如何将给定的 无向图存储在 计算机中?
1
2 3
5 4
可以用一下邻接矩阵来表示
11110 11111 11110 11111 01011
邻接矩阵中通常用二维数组来存放边之间的关系,用一 维数组来存放顶点的信息。所以在接下来的求解问题中 我们将用到二维数组a来存放两边是否相邻,用一维数组 x来存放每个顶点的颜色;x[i]=j表示第i个节点图第j中颜色。
if(OK(t,i)) { x[t]=i;
Backtrace(t+1,m); } } } }
int main() {
int m; int i; printf("请输入颜色种类:\n"); scanf("%d",&m); for(i=1;i<=m;i++)//初始化 x[i]=0; Backtrace(1,m); if(sum==0) { printf("不是%d可着色的!\n",m); } return 0; }