问题描述
给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。
如果有一种着色法使图G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。
图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
你的任务是对于给定的无向连通图G和m种不同的颜色,编写一个JAVA程序来计算无向图G的所有不同着色法。
输入数据格式为:
第一行输入无向图的顶点数 v ,边数 e 和可用的颜色数 cm
第二行开始至第 e 行输入两个顶点连接的边(u,v),u和v输入时以空格区分。
【样例输入】
5 8 4
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5
【样例输出】
48
【代码】
#include<bits/stdc++.h>
using namespace std;
int n,k,m;
int sum=0;
int a[101][101];//1表示未确定颜色
int b[101];//每个顶点的颜色
bool check(int s) {
for(int i=1; i<s; i++)
if(a[i][s]==1&&b[i]==b[s])//是否有重色
return false;
return true;
}
void dfs(int s) {//第几个
if(s==n+1) {
sum++;
return;
}
for(int i=1; i<=m; i++) {//涂什么颜色
b[s]=i;
if(check(s)==true)
dfs(s+1);
b[s]=0;
}
}
int main() {
cin>>n>>k>>m;
for(int i=1; i<=k; i++) {
int x,y;
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=1;
}
dfs(1);
cout<<sum;
return 0;
}