蓝桥杯历届试题 分考场(DFS)

问题描述
  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<vector>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int N=110;
int g[N][N]; 
int n,m; 
int ans=1000;
vector<vector<int> > a(110);//记得开辟空间
void dfs(int cur,int start){//cur表示当前有几个教室 
	if(cur>=ans)return;
	if(start>n){
		ans=min(ans,cur);
		return;
	}
		for(int i=0;i<cur;i++){
			bool flag=true;
		  for(int j=0;j<a[i].size();j++){
		  	int e=a[i][j];
			if(g[e][start]){
			  flag=false;
			  break;
			}
		}
		if(flag==true){
		a[i].push_back(start);
		dfs(cur,start+1);
		a[i].pop_back();
    	}
	}
     	a[cur].push_back(start);
	    dfs(cur+1,start+1);
	    a[cur].pop_back();
	}	   
int main()
{
	cin >> n >> m;
	while(m--){
		int a1,b;
		cin>>a1>>b;
		g[a1][b]=g[b][a1]=1;
	}
	dfs(0,1);
	cout<<ans<<endl;
	return 0;
} 

#include<iostream>
#include<vector>
#include<cstdio>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int N=110;
int g[N][N],room[N][N]; 
int cnt[N];//记录每个房间的人数
int n,m; 
int ans=1000;
void dfs(int cur,int start){//cur表示当前有几个教室 
	if(cur>=ans)return;
	if(start>n){
		ans=min(ans,cur);
		return;
	}
		for(int i=0;i<cur;i++){
			bool flag=true;
			int num=cnt[i];
		  for(int j=0;j<num;j++){
		  	int e=room[i][j];
			if(g[e][start]){
			  flag=false;
			  break;
			}
		}
		if(flag==true){
		room[i][cnt[i]]=start;
		cnt[i]++;
		dfs(cur,start+1);
		cnt[i]--;
    	}
	}
     	room[cur][cnt[cur]]=start;
     	cnt[cur]++;
	    dfs(cur+1,start+1);
	    cnt[cur]--;
	}	   
int main()
{
	cin >> n >> m;
	while(m--){
		int a1,b;
		cin>>a1>>b;
		g[a1][b]=g[b][a1]=1;
	}
	dfs(0,1);
	cout<<ans<<endl;
	return 0;
} 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页