图着色,第一行输入三个数,n,m,k,n为顶点数,m为颜色数,k为边数,n为行数,i到j有边,n小于等于20,输出各点颜色号,一行输出,空格分割,没有就输出NO
#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,k;
int map[105][105];
int color[105];
int ans;
//对于每个点,枚举它可能被染的颜色。如果与它相连的点颜色和它相同,那么就换下一个颜色;如果哪个颜色也不能选,那就回到上一个点换颜色(回溯),当确定完最后一个点的颜色后,这就是一个可行解,将答案增加1。
void a(int p)
{
//遍历图上任意点,因为没有确定编号n以后的点的颜色。所以到n-1就相对于把点全遍历一遍
if(p == n+1)
{
ans++;
return;
}
else
{
for(int i=1;i<=m;i++)
{
int boo = false;
for(int j=1;j<=p;j++)
{
if(map[p][j] == 1 && color[j] == i)
{
boo = true;
break;
}
}
if(boo == true) continue;
color[p] = i;
a(p+1);
color[p] = 0;
}
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++)
{
int d1,d2;
scanf("%d%d",&d1,&d2);
map[d1][d2] = 1;
map[d2][d1] = 1;
}
a(1);
if(ans != 0)
printf("%d",ans);
else
printf("NO");
return 0;
}