给定一个具有n个节点,k条边的无向联通图,给定m中颜色,有多少种着色方案使每一条边的两个顶点的着色不同。(n,k,m都很小于8)
直接枚举每个顶点,然后判断一下是否满足条件,即是否和它的相邻边颜色相同,颜色相同就继续搜下一个节点,否则回溯。
#include <bits\stdc++.h>
using namespace std;
#define MAXN 20
int n,k,m;
vector<int> h[MAXN];
int ans;
int x[MAXN];
void dispasolution()
{
printf("第%d个着色方案:",ans);
for(int j=1;j<=n;j++)
printf("%d",x[j]);
printf("\n");
}
bool same(int i)
{
for(int j=0;j<h[i].size();j++)
if(x[h[i][j]]==x[i])
return false;
return true;
}
void dfs(int i)
{
if(i>n)
{
ans++;
dispasolution();
}
else
{
for(int j=1;j<=m;j++)
{
x[i]=j;
if(same(i))
dfs(i+1);
x[i]=0;
}
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
int a,b;
for(int j=1;j<=k;j++)
{
cin>>a>>b;
h[a].push_back(b);
h[b].push_back(a);
}
dfs(1);
if(ans>0)
cout<<ans<<endl;
else
cout<<-1<<endl;
return 0;
}