歷屆試題 分考場
時間限制: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;
}