-->
当前位置:首页 > 题库 > 正文内容

程序填空题:求解图的m着色问题(回溯法)

Luz4年前 (2021-06-19)题库861
给定无向连通图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


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。