程序填空题:求解图的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