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

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[图的着色 搜索] P2819 图的m着色问题相关的知识,希望对你有一定的参考价值。

P2819 图的m着色问题

题目

在这里插入图片描述

思路

样例的图
在这里插入图片描述
无项连通图,而且没有自环和重边,数据量比较小搜索暴力整一波
另外,从任意起点开始搜是不影响方案数的。

代码

// 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;
}


以上是关于[图的着色 搜索] P2819 图的m着色问题的主要内容,如果未能解决你的问题,请参考以下文章

P2819 图的m着色问题

P2819 图的m着色问题(DFS)

图的m着色问题 (回溯搜索)

图的m着色问题

图论---图的m-点着色判定问题(深搜--迭代式)

回溯法——图的m着色问题