题目描述
新格尔王国的国王为了考查王子们的能力以决定王位继承者,提出了这样一个问题。
有n个点,m条边,现在要给n个点染色,有4种颜色供选择,但相邻的点(两点有连边)不能染相同的颜色,问一共有多少种染色方案?
输入
第一行,两个数n,m,含义如题目所述。(1<=n<=10,1<=m<=50)
接下来m行,每行两个数a,b,表示a,b之间有一条连边。
输出
输出一个数,表示总方案数。
样例输入
5 4
1 2
1 3
1 4
1 5
样例输出
324
#include <bits/stdc++.h>
using namespace std;
int n,m,counts;
int a[20][20];
int color[20];
bool isok(int c)
{
for(int i=1;i<=n;++i)
{
if(a[c][i]==1&&color[i]==color[c])
return false;
}
return true;
}
void dfs(int x)
{
if(x>n)
{
++counts;
return;
}
for(int i=1;i<=4;++i)
{
color[x]=i;
if(isok(x)) dfs(x+1);
color[x]=0;
}
}
int main()
{
// freopen("1.txt","r",stdin);
scanf("%d %d",&n,&m);
for(int i=0;i<m;++i)
{
int x,y;
scanf("%d %d",&x,&y);
a[x][y]=a[y][x]=1;
}
dfs(1);
cout<<counts<<endl;
return 0;
}