题目描述
新格尔王国的国王为了考查王子们的能力以决定王位继承者,提出了这样一个问题。
有n个点,m条边,现在要给n个点染色,有4种颜色供选择,但相邻的点(两点有连边)不能染相同的颜色,问一共有多少种染色方案?
输入
第一行,两个数n,m,含义如题目所述。(1<=n<=10,1<=m<=50)
接下来m行,每行两个数a,b,表示a,b之间有一条连边。
接下来m行,每行两个数a,b,表示a,b之间有一条连边。
输出
输出一个数,表示总方案数。
样例输入
5 41 21 31 41 5
样例输出
324
提示
来源
DFS穷举搜索一遍即可,太久没练了,竟然没想到这种方法,还是看了别人的题解才恍然大悟!!!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<cmath>
using
namespace
std;
#define ESP 1e-6
int
n,m;
int
color[20];
int
link[20][20];
int
ans=0;
bool
isOk(
int
x,
int
col)
{
bool
flag =
true
;
for
(
int
i=1;i<=n;i++)
{
if
(link[i][x]==1 && col==color[i]){
flag =
false
;
break
;
}
}
return
flag;
}
void
dfs(
int
x){
if
(x>n){
ans++;
return
;
}
for
(
int
i=1;i<=4;i++)
{
if
(isOk(x,i))
{
color[x] = i;
dfs(x+1);
color[x] = 0;
}
}
}
int
main()
{
scanf
(
"%d %d"
,&n,&m);
int
from,to;
for
(
int
i=0;i<m;i++)
{
scanf
(
"%d %d"
,&from,&to);
link[from][to] = link[to][from] = 1;
}
dfs(1);
printf
(
"%d\n"
,ans);
return
0;
}