【蓝桥杯有点意思】图的最优着色

图的最优着色问题,链接在这里
这题是一个蓝桥杯的题。(蓝桥杯的题都挺裸的)
很明显直接就能看出来这是一个图的最优着色问题。
我们只需要枚举一下当前的同学,在某一个考场内有没有冲突即可,数据只有100,所以也没有什么问题。
下面我们在分析一下算法流程:
对于当前同学,我们枚举一下现有的教室,如果教室内的人都与他没有冲突,那么当前同学就可以放在这个教室里面,如果现有的教室全部都有冲突,那么我们就可以给当前的同学新开一个教室啦。
不要忘记回溯
下面是代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1010;
int n,m;
int ans = INF;
int G[maxn][maxn];
int c[maxn];
int f[maxn][maxn];
void dfs(int x,int tot)
{
	if(tot>=ans) return;
	if(x==n+1)
	{
		ans = min(ans,tot);
		return;
	}
	for(int i=1;i<=tot;i++)
	{
		int tmp = 0;
		for(int j=1;j<=c[i];j++)
		{
			if(!G[x][f[i][j]]) tmp++;
		}
		if(tmp==c[i])
		{
			f[i][++c[i]] = x;
			dfs(x+1,tot);
			c[i]--;
		}
	}
	f[tot+1][++c[tot+1]] = x;
	dfs(x+1,tot+1);
	c[tot+1]--;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		G[a][b] = 1;
		G[b][a] = 1;
	}
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}

其中c[i]表示第i个教室里面的人数,f[i][j]表示第i个教室里面第j个人。G[i][j]记录i和j有没有冲突。

猜你喜欢

转载自blog.csdn.net/KIKO_caoyue/article/details/87903525
今日推荐