m着色问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ private:
int n,
//图的顶点个数
m,
//可用颜色数
**a,
//图的邻接矩阵,用来表示一个无向连通图G
*x;
//当前解
long sum;
//当前已找到的可m着色方案数
public:
color();
int ok(int k);
void backtrack(int t);
void op();
~color();
};
/*构造函数的定义*/
color::color()
{ int k;
//边数
int i,j;
int v1,v2;
//构成边的两顶点
ifstream fin("input.txt",ios::nocreate);
if(!fin)
{cerr<<"文件不存在";
exit(0); }
fin>>n>>k>>m;
a[v1][v2]或a[v2][v1]赋值
}
if(!(x=new int[n+1]))
{cerr<<"insufficient memory!"<<endl;
exit(0); }
for(i=0;i<=n;i++)
x[i]=0;
//对x数组初始化,作为未着色情况
sum=0;
fin.close();
}
if(ok(t))
backtrack(t+1); //如果该颜色可用,判断下一个顶点
}
}
/*输出函数的定义*/
void color::op()
{ ofstream out("output.txt");
out<<sum<<endl;
out.close(); }
/*析构函数的定义*/ color::~color() { delete[] x;
//读入顶点数、颜色数和边数
if(!(a=new int*[n+1]))
{cerr<<"insufficient memory!"<<endl;
exit(0); }
for(i=0;i<=n;i++)
if(!(a[i]=new int[n+1]))
{cerr<<"insufficient memory!"<<endl;
图的 m着色问题
问题描述: 给定无向连通图 G 和 m 种不同的颜色。用这些颜色为图 G 的各顶点着色,每个顶点
着 一种颜色。如果有一种着色法使 G 中每条边的 2 个顶点着不同颜色,则称这个图是 m
可着 色的。图的 m 着色问题是对于给定图 G 和 m 种颜色,找出所有不同的着色法。
编程任务:
对于给定的无向连通图 G和 m种不同的颜色,编程计算图的所有不同的着色法。 数据输入:
//不冲突返回1
}
/*递归函数的定义*/
void color::bห้องสมุดไป่ตู้cktrack(int t)
{ int i;
if(t>n) sum++;
//考虑完所有顶点,此时的解是其中一种着
色方式,累加一次
else
for(i=1;i<=m;i++) //考虑顶点t的各种着色情况
{x[t]=i;
//保存顶点t所着的颜色
输入文件示例
输出文件示例
input.txt
584 12 13 14 23 24 25 34 45
output.txt 48
/*图的m着色问题求解程序(回溯算法)*/
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>
class color
/*判断函数的定义*/
//检查颜色可用性
int color::ok(int k)
{ for(int i=1;i<k;i++) //将顶点k的颜色和之前着色过并和k相连的
顶点颜色对比,查看是否冲突
if((a[k][i]==1)&&(x[i]==x[k]))
return 0;
//如果冲突返回0
return 1;
for(int i=0;i<=n;i++) delete[] a[i];
delete[] a;}
/*主程序部分*/ int main() { color zhuose;
zhuose.backtrack(1); zhuose.op(); return 1;}
//实现对整个解空间的回溯搜索
由文件 input.txt 给出输入数据。第 1 行有 3 个正整数 n,k 和 m,表示给定的图 G 有n 个顶点和 k 条边,m 种颜色。顶点编号为 1,2,…,n。接下来的 k 行中,每行有 2 个正 整数 u,v,表示图 G 的一条边(u,v)。 结果输出:
程序运行结束时,将计算出的不同的着色方案数输出到文件 output.txt 中。
delete[] a;
exit(0); }
for(i=1;i<=n;i++)
//邻接矩阵初始化
for(j=1;j<=n;j++)
a[i][j]=0;
for(i=1;i<=k;i++)
//邻接矩阵的建立
{fin>>v1>>v2;
a[v1][v2]=a[v2][v1]=1; //对有连接的两个顶点v1,v2表示的边