蓝桥杯练习系统 历届真题 分考场

分析:把n个学生设为n个不同的结点,认识的学生用线连接。注意这题与图的着色问题的区分,图的着色问题要求点与点之间的连线不可交叉,而这题显然是可以的,所以这题不可用四色原理解决。又由于这题数据规模较小,所以这里我们可以直接用深搜解决。

思路:

初始化:假设n个学生的序号为1~n。以二维矩阵matrixs存储不同学生之间的联系,1表示有联系,0表示没有联系。以二维矩阵room表示m个考场容纳的学生。从学生1开始递归。

递归:

1.假设目前有一个考场,从学生1开始递归。若该次递归满足递归条件,则进行步骤二,否则,跳出该次递归。

2.把学生i安置到rnum个考场中的一个,并按考场序号从1开始依次判断每个考场中的学生是否与该学生有联系,若没有,则把该学生安置到该考场,然后对学生 i+1 进行递归。若没有考场符合条件,则把该学生安置到rnum+1考场,再对学生i+1进行递归。

 

#include <bits/stdc++.h>
#define maxn 234
using namespace std;

int matrixs[maxn][maxn] = {}, room[maxn][maxn] = {};
int num, cnt;
void dfs(int xx, int rnum)
{
    ///cout << xx << "  " << rnum << endl;
    if(rnum >= cnt) return;
    ///注意这里,是只要考场数比目前最小考场数小就可以剪枝了
    if(xx == num + 1)
    {
        cnt = min(cnt, rnum);
        ///cout << cnt << "****" << endl;
        return;
    }
    int jj, kk = 0;
    ///jj表示第几个考场,kk表示第jj个考场的第kk个座位
    for(jj = 1; jj <= rnum; jj++)
    {
        kk = 0;
        while(room[jj][kk] && !matrixs[xx][room[jj][kk]]) kk++;
        if(room[jj][kk] == 0)
        {
            room[jj][kk] = xx;
            dfs(xx + 1, rnum);
            room[jj][kk] = 0;
        }
    }
    room[rnum + 1][0] = xx;
    dfs(xx + 1, rnum + 1);
    room[rnum + 1][0] = 0;
}
int main()
{
    int m;
    scanf("%d %d", &num, &m);
    {
        memset(matrixs, 0, sizeof(matrixs));
        memset(room, 0, sizeof(room));
        cnt = num;
        for(int i = 1; i <= m; i++)
        {
            int ss, tt;
            scanf("%d %d", &ss, &tt);
            matrixs[ss][tt] = matrixs[tt][ss] = 1;
        }
        dfs(1, 1);
        printf("%d\n", cnt);
    }
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值