图的最优着色问题,链接在这里
这题是一个蓝桥杯的题。(蓝桥杯的题都挺裸的)
很明显直接就能看出来这是一个图的最优着色问题。
我们只需要枚举一下当前的同学,在某一个考场内有没有冲突即可,数据只有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有没有冲突。