分考场

分考场

问题描述:

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

思路:

深度优先搜索,途中加上简单剪枝。

/**********************************************************
* @Author: 			   .Sunbeam
* @Date:   			   2020-03-20 12:55:42
* @Last Modified by:   .Sunbeam
* @Last Modified time: 2020-03-20 13:10:58
* @Remark: 
**********************************************************/
#include <bits/stdc++.h>
#define lowbit(x) (x&(-x))
#define CSE(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define Abs(x) (x>=0?x:(-x))
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll , ll> pll;

const int maxn=111;
int fid[maxn][maxn],room[maxn][maxn];
int n,m,ar[maxn],ans=INF;

void dfs(int ad,int num){
	if(ad>n){
		ans=min(ans,num);
		return;
	}
	if(num>=ans) return;
	for(int i=0;i<num;i++){
		bool fl=true;
		for(int j=0;j<ar[i];j++){
			if(fid[ad][room[i][j]]==1){
				fl=false;
				break;
			}
		}
		if(fl){
			room[i][ar[i]++]=ad;
			dfs(ad+1,num);
			ar[i]--;
		}
	}
	room[num][ar[num]++]=ad;
	dfs(ad+1,num+1);
	ar[num]--;
	return;
}

int main()
{
	#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	#endif
	FAST;
	cin>>n>>m;
	CSE(fid,0);
	CSE(room,0);
	CSE(ar,0);
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		fid[a][b]=fid[b][a]=1;
	}
	dfs(1,0);
	cout<<ans<<endl;
	return 0;
}
posted @ 2020-03-20 13:20  落水清心  阅读(165)  评论(0编辑  收藏  举报