程序填空题:求解图的m着色问题(回溯法)
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的两个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
### 裁判测试程序样例:
```c++
#include
#include
#define MAXN 20 //图最多的顶点个数
int n,k,m;
int a[MAXN][MAXN];
int count=0; //全局变量,累计解个数
int x[MAXN]; //全局变量,x[i]表示顶点i的着色
bool Same(int i) //判断顶点i是否与相邻顶点存在相同的着色
{
for (int j=1;j<=n;j++)
if ()
return false;
return true;
}
void dfs(int i) //求解图的m着色问题
{
if (i>n) //达到叶子结点
{
;
}
else
{
for (int j=1;j<=m;j++) //试探每一种着色
{
x[i]=j;
if () //可以着色j,进入下一个顶点着色
dfs(i+1);
; //回溯
}
}
}
int main()
{
memset(a,0,sizeof(a)); //a初始化
memset(x,0,sizeof(x)); //x初始化
int x,y;
scanf("%d%d%d",&n,&k,&m); //输入n,k,m
for (int j=1;j<=k;j++)
{
scanf("%d%d",&x,&y); //输入一条边的两个顶点
a[x][y]=1; //无向图的边对称
a[y][x]=1;
}
dfs(1); //从顶点1开始搜索
if (count>0) //输出结果
printf("%d",count);
else
printf("-1");
return 0;
}
```
### 输出格式:
程序运行结束时,将计算出的不同的着色方案数输出。如果不能着色,程序输出-1。
### 输入样例:
```in
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
```
### 输出样例:
```out
48
```
答案:
第1空:a[i][j]==1 && x[i]==x[j]
第2空:count++
第3空:Same(i)
第4空:x[i]=0
### 裁判测试程序样例:
```c++
#include
#include
#define MAXN 20 //图最多的顶点个数
int n,k,m;
int a[MAXN][MAXN];
int count=0; //全局变量,累计解个数
int x[MAXN]; //全局变量,x[i]表示顶点i的着色
bool Same(int i) //判断顶点i是否与相邻顶点存在相同的着色
{
for (int j=1;j<=n;j++)
if ()
return false;
return true;
}
void dfs(int i) //求解图的m着色问题
{
if (i>n) //达到叶子结点
{
;
}
else
{
for (int j=1;j<=m;j++) //试探每一种着色
{
x[i]=j;
if () //可以着色j,进入下一个顶点着色
dfs(i+1);
; //回溯
}
}
}
int main()
{
memset(a,0,sizeof(a)); //a初始化
memset(x,0,sizeof(x)); //x初始化
int x,y;
scanf("%d%d%d",&n,&k,&m); //输入n,k,m
for (int j=1;j<=k;j++)
{
scanf("%d%d",&x,&y); //输入一条边的两个顶点
a[x][y]=1; //无向图的边对称
a[y][x]=1;
}
dfs(1); //从顶点1开始搜索
if (count>0) //输出结果
printf("%d",count);
else
printf("-1");
return 0;
}
```
### 输出格式:
程序运行结束时,将计算出的不同的着色方案数输出。如果不能着色,程序输出-1。
### 输入样例:
```in
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
```
### 输出样例:
```out
48
```
答案:
第1空:a[i][j]==1 && x[i]==x[j]
第2空:count++
第3空:Same(i)
第4空:x[i]=0