首页 > 其他分享 >分考场 【 DFS + 染色问题 】

分考场 【 DFS + 染色问题 】

时间:2023-02-14 16:32:59浏览次数:42  
标签:vis int 染色 gra tot 考场 num DFS ans


试题 历届试题 分考场

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  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

样例输入

5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

样例输出

5

#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
int gra[200][200]; // 记录两个人之间的关系,gra[i][j] == 1 代表 i 和 j 认识
int vis[200][200]; // vis[i][j] == 1 代表第 i 间教室的第 j 人在这间教室。
int n,m;
int c[200]; // c[i] 表示第 i 个房间的人数
int ans; // 最终答案
int flag; // 在 DFS 中用于判断当前 s 是否能分配给当前教室
void dfs(int s, int tot, int num) // s 为当前的人,tot 为当前一共分配的教室,num 为当前分配到了多少人了
{
if(tot >= ans)
{
return ;
}
if(num == n)
{
ans = min(ans,tot);
return ;
}

for(int i = 1; i <= tot; i ++)
{
flag = 1; // 假设能分配
for(int j = 1; j <= c[i]; j ++) // c[i] 代表 i教室的总人数
{
if(gra[s][vis[i][j]]) // 代表 s 和 vis[i][j] 有关系,也就是第 i 间教室的第 j 同学有关系
{
flag = 0;
break;
}
}
if(flag)
{
vis[i][++c[i]] = s;
dfs(s+1,tot,num+1);
--c[i];
}
}
vis[tot+1][++c[tot+1]] = s;
dfs(s+1,tot+1,num+1);
--c[tot+1];

}
int main()
{
int u,v;
scanf("%d\n%d", &n, &m);
for(int i = 0; i < m; i ++)
{
scanf("%d %d", &u, &v);
gra[u][v] = gra[v][u] = 1;
}
ans = n;
dfs(1,0,0);
printf("%d\n",ans);
return 0;
}

 

标签:vis,int,染色,gra,tot,考场,num,DFS,ans
From: https://blog.51cto.com/u_15965659/6057229

相关文章

  • 大臣的旅费 【树的直径】【DFS】
    大臣的旅费Description很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。为节省经费,T国的大臣们经过思考,制定了一套优秀......
  • L2-020 功夫传人 (25 分) 【 DFS 】
    L2-020 功夫传人 (25 分)一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱……直到某一支......
  • 【DFS】飞行员兄弟
    导读^_^搜索问题本质是递归问题。在递归的过程中,进行决策选择。今天讲解一下飞行员兄弟这道简单深搜题。飞行员兄弟算法思路看到这个问题,数据范围这么小,毫无疑问,......
  • 【DFS】LeetCode 108. 将有序数组转换为二叉搜索树
    题目链接108.将有序数组转换为二叉搜索树思路类似于二分搜索,定位到数组中间mid,然后左边的子数组构成左子树,右边的子数组构成右子树,mid处的数字构成根结点。递归构建......
  • 【DFS】LeetCode 669. 修剪二叉搜索树
    题目链接669.修剪二叉搜索树思路若root.val小于边界值low,则root的左子树必然均小于边界值,我们递归处理root.right即可;若root.val大于边界值high,则root的......
  • 【DFS】LeetCode 98. 验证二叉搜索树
    题目链接98.验证二叉搜索树思路依据BST的定义:左子树的结点都比根结点小,右子树的结点都比根结点大。我们在递归过程中传递根节点的值,判断当前结点值与根结点值的大小......
  • 图论算法讲义(一)$\Rightarrow$ DFS
    1.在图上$dfs$从本质上来说在图上$dfs$和直接使用搜索其实本质是一样的$DFS$中文名是深度优先搜索,是一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向......
  • [HAOI2018]染色
    \(\text{Solution}\)第二道二项式反演题挺套路的设\(g(i)\)为恰好出现\(S\)次的颜色至少有\(i\)种那么\[g(i)=\binom{m}{i}\binom{n}{is}\frac{(is)!}{(s!)^i}(......
  • LeetCode全排列AcWing842. 排列数字(/dfs)
    原题解Acwing同一个题,主要参考写法题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。约束题解classSolution{publi......
  • 浅析 SeaweedFS 与 JuiceFS 架构异同
    SeaweedFS是一款高效的分布式文件存储系统,最早的设计原型参考了Facebook的Haystack,具有快速读写小数据块的能力。本文将通过对比SeaweedFS与JuiceFS在设计与功能上......