【搜索与回溯算法】图的m着色问题
题目描述
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
输入
第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
输出
程序运行结束时,将计算出的不同的着色方案数输出
样例输入
5 8 4 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5
样例输出
48
数据范围限制
n<=50,m<=5
#include<bits/stdc++.h>
using namespace std;
int a[55][55],n,k,m,x,y,b[55];
long long ans;
bool ch(int q,int t)
{
for(int i=1;i<q;i++)
if(a[q][i]==1&&b[i]==t) return false;
return true;
}
void dg(int p)
{
if(p==n+1) ans++;
else
for(int i=1;i<=m;i++)
if(ch(p,i)){
b[p]=i;
dg(p+1);
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=1;
}
dg(1);
printf("%d",ans);
return 0;
}