zoukankan      html  css  js  c++  java
  • 蓝桥杯 历届试题 分考场

    题目描述
    n个人参加某项特殊考试。
    为了公平,要求任何两个认识的人不能分在同一个考场。
    求是少需要分几个考场才能满足条件。
    输入
    第一行,一个整数n(1<n<100),表示参加考试的人数。
    第二行,一个整数m,表示接下来有m行数据
    以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
    输出
    一行一个整数,表示最少分几个考场。
    样例输入
    5
    8
    1 2
    1 3
    1 4
    2 3
    2 4
    2 5
    3 4
    4 5
    样例输出
    4

    思路:可以抽象为无向图染色问题。相邻顶点不能染相同颜色,问至少要用多少种颜色。

    用DFS搜搜搜。
    假设 n 个人需要 kcs 个考场 ,先在 kcs 个考场 安排n 个人 如果安排不下 再增加考场数。
    通过DFS +剪枝 从所有可能情况中得到最小考场数。

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 110;
    int gxb[N][N];//关系表 
    int p[N][N];// 房间状态  
    int num = N, n;
    void DFS(int x, int kcs) {//x 代表当前安排了多少个人 kcs 代表考场数
    	if (kcs >= num)return;//剪子 
    	if (x == n + 1) { num = min(num, kcs); return; }//如果已经安排了n个人,进行判断  
    	int j, k;
    	for (j = 1; j <= kcs; j++) {//枚举考场
    		k = 0;
    		while (p[j][k] && !gxb[x][p[j][k]])k++;//找到一个空位 并且与该考场人无关系 
    		if (p[j][k] == 0)p[j][k] = x, DFS(x + 1, kcs), p[j][k] = 0;//满足条件 进行下一考生 
    	}                                    //回溯 
    	p[j][0] = x;
    	DFS(x + 1, kcs + 1);// 如果所有房间都不满足条件 增加房间 
    	p[j][0] = 0;//回溯 
    }
    int main() {
    	int m, i, s1, s2;
    	memset(gxb, 0, sizeof(gxb));
    	memset(p, 0, sizeof(p));
    	scanf("%d
    %d", &n, &m);
    	for (i = 1; i <= m; i++) {
    		scanf("%d%d", &s1, &s2);
    		gxb[s1][s2] = gxb[s2][s1] = 1;//建关系 
    	}
    	DFS(1, 1);
    	printf("%d
    ", num);
    	return 0;
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    C#访问MySql连接字符串
    简单的async和await用法
    Nuget新旧地址更换
    【NPS】nps分多少算好
    「干货」什么Linux是邮件服务器?
    「干货」编程语言十大经典算法,你知道几个?
    实验干货分享:用Go语言实现分布式缓存开发之map
    开发微信小程序游戏真的有手就行吗?
    图数据库Neo4j的介绍与使用
    干货分享:什么是Java设计三大工厂模式?
  • 原文地址:https://www.cnblogs.com/RioTian/p/13654092.html
Copyright © 2011-2022 走看看