首页 > 其他 > 详细

蓝桥杯真题-分考场

时间:2020-02-06 00:30:57      阅读:205      评论:0      收藏:0      [点我收藏+]

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T457

问题描述:
  n个人参加某项特殊考试。
  为了公平,要求任何两个认识的人不能分在同一个考场。
  求是少需要分几个考场才能满足条件。
输入格式:
  第一行,一个整数n(1<n<100),表示参加考试的人数。
  第二行,一个整数m,表示接下来有m行数据
  以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
输出格式:
  一行一个整数,表示最少分几个考场。
 
思路:
求出安排这些考生最少需要的考场数目num
开始:没有考场,num=0
安排第一个人a:新建一个考场,num=1
安排第二个人b:判断b与a的关系,
若认识,我们只有一种选择,新建考场,num=2
若不认识,我们可以有两种选择,与a在同一个考场,或者新建考场,我们目前不知道这两种选择哪种最优------这时候,我们想到该题应该要使用到回溯
每一个考生都有两种选择:新建考场,选择已建的某个考场
一个无向图着色,要求相邻的点不能是同色,方案有多种,找出所用颜色数最少的方案即可解题。
着色过程是按点顺序一一着色,n个点,一一按顺序为点1~n着色,着色完一个点继续着色下一个点,直至着色完n个点。
由于一个点可以多种合理的着色方案,不同的着色方案对最终的颜色种数影响是不同的,所以需要一一比较所有的方案,过程类似深搜回溯。
 
代码:
 
解法一:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

#define maxn 105
int n,m;
int f[maxn][maxn]={0};//f[i][j]=0表示第i个人与第j个人无关系 
int people_room[maxn];//p_c[i]表示第i个人所在的考场 
int ans=99999;

bool judge(int x,int y){//判断第x个人是否可以在第y个考场
    //判断该考场没有与x有关系的人
    for(int i = 1;i<=n;i++){
        if(people_room[i] == y){//表示i是在y考场的人
            if(f[i][x]==1){//表示i与x有关系 
                return false;
            }
        } 
    } 
     return true;
} 

void arrange_room(int x,int room_num){//表示当前安排到第x个人,已使用room_num个数量的考场 
    if(room_num>=ans) {
        return;
    }
    if(x>n) {//表示安排任务结束 
        ans=min(ans,room_num);
        return;
    }
    //枚举所有已使用的考场,看第x个人是否可在
    for(int room=1;room<=room_num;room++){
        if(judge(x,room)==true){
            people_room[x]=room;//涂色(安排房间)
            arrange_room(x+1,room_num);
            people_room[x]=0;
        }
    } 
    //前面room_num所有考场都无法使用,只能新建考场
    people_room[x]=room_num+1;
    arrange_room(x+1,room_num+1);
    people_room[x]=0;
}

int main(){
    int x,y;
    cin>>n>>m;
    while(m--){
        cin>>x>>y;
        f[x][y]=f[y][x]=1;
    }
    arrange_room(1,0);
    cout<<ans<<endl;
} 
 
解法二:
改进:前向星
 

蓝桥杯真题-分考场

原文:https://www.cnblogs.com/Aiahtwo/p/12267118.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!