歷屆試題 分考場

歷屆試題 分考場  

時間限制: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

 

數據不大,dfs暴力;

#include<bits/stdc++.h>
using namespace std;
int a[105][105]={0};
int re=0xffffff;
int n;
void dfs(vector<int>q[105],int i,int k){
	
	
	if(k>=re){  //剪枝 
		return;
	}
	
	if(i>n){
	
		re=min(re,k);
		return;
	}
	

	for(int j=0;j<k;j++){
		int f=0;
		for(int t=0;t<q[j].size();t++){
			if(a[q[j][t]][i]==1){
			    f=1;	
			    break;
			}
		}
		if(f==0){  //當前教室沒有朋友可以插入 
			q[j].push_back(i);
			dfs(q,i+1,k);
			q[j].pop_back();
		}
	}
	
	//另開一個教室 
	q[k].push_back(i);
	dfs(q,i+1,k+1);
	q[k].pop_back();

		
	
}
int main(){
	int m,k;
	cin>>n;
	cin>>m;
	for(int i=0;i<m;i++){
		int x,y;
		cin>>x>>y;
		a[x][y]=a[y][x]=1;
	}
	vector<int>q[105];

	dfs(q,1,0);
	cout<<re;
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章