P2819 图的m着色问题

题目

[图的着色 搜索] P2819 图的m着色问题_i++

思路

样例的图

[图的着色 搜索] P2819 图的m着色问题_连通图_02


无项连通图,而且没有自环和重边,数据量比较小搜索暴力整一波

另外,从任意起点开始搜是不影响方案数的。

代码

// Problem: P2819 图的m着色问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2819
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// FishingRod

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY

*/
int T;
const int N=105;
bool g[N][N];
int color[N];
int n,k,m;
int cnt;
void dfs(int u)
{
if(u>n)
{
cnt++;
return;
}
for(int i=1;i<=m;i++)//想要节点u涂上颜色i
{
bool flag=1;
for(int v=1;v<=u;v++)//检查一下u可不可以染色i,检查和已经填的有没有冲突,别写成v<=n
if(g[u][v]&&u!=v&&color[v]==i)//如果联通并且不是自环而且颜色相同
{
flag=0;
break;
}
if(flag)
{
color[u]=i;
dfs(u+1);
color[u]=1;
}
}
}
void solve(int C)
{
//NEW DATA CLEAN

//NOTE!!!
cin>>n>>k>>m;
for(int i=1;i<=k;i++)
{
int u,v;cin>>u>>v;
g[u][v]=g[v][u]=true;
}
dfs(1);
cout<<cnt<<endl;

}

int main()
{
#ifdef MULINPUT
scanf("%d",&T);
for(int i=1;i<=T;i++)solve(i);
#else
solve(1);
#endif
return 0;
}