问题描述
  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<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector> using namespace std; const int maxn = 110;
const int inf = 0x3f3f3f3f;
int gra[maxn][maxn];
int cun[maxn][maxn];
int cnt[maxn];
int res=inf;
int n,m;
void solve(int id,int num){
if(num>=res){
return;
}
if(id>n){
res=min(res,num);
return;
}
for(int i=1;i<=num;i++){
int sz=cnt[i];
int jishu=0;
for(int j=1;j<=sz;j++){
if(gra[id][cun[i][j]]==0){
jishu++;
}
}
if(jishu==sz){
cun[i][++cnt[i]]=id;
solve(id+1,num);
cnt[i]--;
}
}
cun[num+1][++cnt[num+1]]=id;
solve(id+1,num+1);
--cnt[num+1];
}
int main(){
scanf("%d%d",&n,&m);
memset(gra,0,sizeof(gra));
memset(cnt,0,sizeof(cnt));
while(m--){
int a,b;
scanf("%d%d",&a,&b);
gra[a][b]=gra[b][a]=1;
}
solve(1,0);
printf("%d\n",res);
return 0;
}

  

最新文章

  1. AngularJS---表达式
  2. Android Plugin
  3. Nginx 配置详解
  4. mac安装django1.5.4
  5. How a non-windowed component can receive messages from Windows -- AllocateHWnd
  6. android连接本地tomcat服务器,报timeout
  7. hdu 4814 Golden Radio Base
  8. [039] 微信公众帐号开发教程第15篇-自定义菜单的view类型(访问网页)
  9. Visual Studio统计有效代码行数
  10. Important Programming Concepts (Even on Embedded Systems) Part V: State Machines
  11. Sliverlight实例之 绘制扇形和环形图
  12. js截取文件名
  13. Windows7下安装IIS
  14. HDU 1908 Double Queue(set)
  15. JavaScript基础4——关于语句流程控制(分支语句、循环语句等)
  16. Quick Select算法
  17. fliplr函数
  18. tensorFlow入门实践(三)实现lenet5(代码结构优化)
  19. Javascript数组系列一之栈与队列
  20. laravel service provider

热门文章

  1. 发布并开源自己的一款 基于.Net 4.0 及 netstandard2.0 的 ORM 框架
  2. SVN 的安装及配置
  3. MYSQL如何优化?
  4. matlab 代码分析
  5. python函数参数*args **kwargs
  6. ldap yum安装-centos6
  7. JavaScript--字符串与JSON对象相互转换
  8. (转)使用OpenGL显示图像(五)添加移动
  9. HDU 6610 Game — 2019第三场杭电多校 1008题
  10. python sum()函数的用法