问题描述
n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
为了公平,要求任何两个认识的人不能分在同一个考场。
求是少需要分几个考场才能满足条件。
输入格式
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。
第二行,一个整数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
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
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 <cstdio> #include <vector> #include <cstdlib> #include <cstring> #define inf 0x3f3f3f3f using namespace std; int n,m; bool gvis[101]; int g[101]; int u[10001],v[10001],first[10001],nex[10001]; int ans; bool check(int k,int gi) { int kk = first[k]; while(kk != -1) { if(g[v[kk]] == gi) return false; kk = nex[kk]; } return true; } void dfs(int k,int num) { if(num >= ans) return; if(k > n) { ans = num; return; } for(int i = 1;i <= num + 1;i ++) { if(!gvis[i]) { gvis[i] = true; g[k] = i; dfs(k + 1,num + 1); g[k] = 0; gvis[i] = false; } else if(check(k,i)) { g[k] = i; dfs(k + 1,num); g[k] = 0; } } } int main() { scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); ans = n; for(int i = 0;i < m;i ++) { scanf("%d%d",&u[i],&v[i]); nex[i] = first[u[i]]; first[u[i]] = i; u[i + m] = v[i]; v[i + m] = u[i]; nex[i + m] = first[u[i + m]]; first[u[i + m]] = i + m; } dfs(1,0); printf("%d",ans); }
如果觉得有帮助,点个推荐啦~