解题思路:从第一个人开始搜索,遍历已经有的考场,检查在他之前的人中哪一个在这个考场,并且他们认识不认识,如果有认识的就跳过这个考场,去下一个考场,如果没有认识的可以选择放在这个考场,或者最后自己再新开一个考场。

  1. #include<bits/stdc++.h>
  2. #define x first
  3. #define y second
  4. #define mem(h) memset(h,-1,sizeof h)
  5. #define mcp(a,b) memcpy(a,b,sizeof b)
  6. using namespace std;
  7. typedef long long LL;
  8. typedef unsigned long long ull;
  9. typedef pair<int,int>PII;
  10. typedef pair<double,double>PDD;
  11. namespace IO{
  12. inline LL read(){
  13. LL o=0,f=1;char c=getchar();
  14. while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
  15. while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
  16. return o*f;
  17. }
  18. }using namespace IO;
  19. //#############以上是自定义技巧(可忽略)##########
  20. const int N=1e2+7,M=2e5+7,INF=0x3f3f3f3f,mod=1e8+7,P=131;
  21. int n,m;
  22. int g[N][N];
  23. int col[N];
  24. int ans=INF;
  25. void dfs(int id,int cnt){//id表示当前是哪个人,cnt表示已经有了几个教室
  26. if(cnt>=ans)return;
  27. if(id==n+1){//如果已经搞完所有人
  28. ans=min(ans,cnt);
  29. return ;
  30. }
  31. for(int i=1;i<=cnt;i++){//遍历每个考场
  32. bool flag=1;
  33. for(int j=1;j<id;j++){//遍历他之前的人
  34. if(col[j]==i&&g[id][j]){//看他之前的人哪个属于当前这个考场i,并且两个认识,就不合法
  35. flag=0;
  36. break;
  37. }
  38. }
  39. if(!flag)continue;//不合法就跳过
  40. col[id]=i;//到这里就这么当前考场是合法的,可以把他试放在这个考场
  41. dfs(id+1,cnt);
  42. col[id]=0;
  43. }
  44. col[id]=cnt+1;//或者他自己再新开一个考场
  45. dfs(id+1,cnt+1);
  46. col[id]=0;
  47. }
  48. int main(){
  49. cin>>n>>m;
  50. for(int a,b,i=0;i<m;i++){
  51. cin>>a>>b;
  52. g[a][b]=1,g[b][a]=1;//存储认识的人
  53. }
  54. dfs(1,0);
  55. cout<<ans<<endl;
  56. return 0;
  57. }
点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论