题目描述:
给定无向连通图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)。
1≤n≤100,1≤k≤2420,1≤m≤6。
输出:
计算出的不同的着色方案数
样例输入:
5 8 4 1 2 1 3 1 4 2 3 2 4 2 5 3 4 4 5
样例输出:
48
提示:
题目中的图我们可以用一个二维数组a[i][j]存储i顶点和j顶点之间的边关系。
比如a[i][j]=1表示i和j之间有边,a[i][j]=0表示i和j之间没有边。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
int n,k,m,ans,a[110][110],colour[110];
bool OK(int dep,int x){
for(int i=1;i<=dep-1;i++){
if(colour[i]==x&&a[i][dep]==1)return false;
}
return true;
}
void DFS(int dep){
if(dep==n+1){
ans++;
return;
}
for(int i=1;i<=m;i++){
if(OK(dep,i)){
colour[dep]=i;
DFS(dep+1);
colour[dep]=0;
}
}
}
int main(){
cin>>n>>k>>m;
for(int i=1;i<=k;i++){
int x,y;
cin>>x>>y;
a[x][y]=a[y][x]=1;
}
colour[1]=1;
DFS(2);
cout<<ans*m;
return 0;
}
如有疑问,可以在下方评论中提出哦~
小编会尽量解决你的问题。