lanqiao OJ 109 分考场

简介: lanqiao OJ 109 分考场

1.分考场 - 蓝桥云课 (lanqiao.cn)

dfs搜索

剪枝:num是以前排教室出的所有安排的最少教室,如果我们这一次的排的教室已经多于现在的num了,就直接return就行了

a[i][j] 用此数组来记录两者之间认不认识

v[i][j] 表示第i个教室的第j个座位坐着的人

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std ;
const int N = 110;
int a[N][N] ;
int v[N][N] ; //v表示第i个教室的第j个座位
int n , m ; 
int num = N ;//表示当前的最优教室安排
void dfs(int x,int room){
  if(room >= num ) return ;//比以前的最好情况差,直接返回
  if(x > n ){
    num = min(num , room) ;//其实这里直接num = room 就行  因为前面比sum大的已经返回了
    return ;
  } 
  int k = 1 ;//遍历教师的每一个座位
  for(int j = 1 ; j <= room ; j ++){
    k=1;
    while(v[j][k] && !a[x][v[j][k]]) k ++ ;//往后找 如果中间碰到了一个认识的人k就停止+1
    if(!v[j][k]){                          //如果找完遍历教室的人没有认识的就刚好把它安排在这个教室的k个座位
      v[j][k] = x ;
      dfs(x+1,room);
      v[j][k] = 0 ;
    }
  }
//所有的教室都有认识的,只能给这个人单独开一个教室
  v[room+1][1] =x ;
  dfs(x+1,room+1) ;
  v[room+1][1] = 0 ;
}
 
 
int main(){
  cin >> n >> m ;
  for(int i = 1 ; i <= m ; i ++){
    int x,y ; cin >> x >> y ;
    a[x][y] = a[y][x] = 1 ;
  }
  dfs(1,1);
  cout << num << endl ;
  return 0 ;
}
目录
相关文章
|
3月前
lanqiao OJ 22年省赛 扫雷
lanqiao OJ 22年省赛 扫雷
38 1
|
3月前
lanqiao OJ 1505 剪邮票
lanqiao OJ 1505 剪邮票
34 0
|
3月前
lanqiao OJ 99 分巧克力
lanqiao OJ 99 分巧克力
22 1
|
3月前
lanqiao OJ 1024 游园安排
lanqiao OJ 1024 游园安排
25 3
|
3月前
lanqiao OJ 364 跳石头
lanqiao OJ 364 跳石头
39 6
|
3月前
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
20 2
|
3月前
lanqiao OJ 525 传球游戏
lanqiao OJ 525 传球游戏
34 2
|
3月前
lanqiao OJ 89 路径之谜
lanqiao OJ 89 路径之谜
31 1
|
3月前
lanqiao OJ 2143 最少刷题数
lanqiao OJ 2143 最少刷题数
22 0
|
3月前
lanqiao OJ 2097 青蛙过河
lanqiao OJ 2097 青蛙过河
16 0