算法2
分考场
#include<bits/stdc++.h> using namespace std; int n,m,total; bool isknow[101][101],ok[101]; int main() { cin>>n>>m; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; isknow[a][b]=true; isknow[b][a]=true; } total=0;//最多需要n间考场 for(int i=1;i<=n;i++){ if(!ok[i]){ ok[i]=true; total++; for(int j=i+1;j<=n;j++){ if(!ok[j]&&!isknow[i][j]){//j没有被分配考场并且i,j互相不认识,把j分配在i的考场 ok[j]=true; } } } } cout<<total; return 0; } //方法错误,没有考虑到互相认识的i和j、i和k不认识,但j和k认识的情况
还是错的
#include<bits/stdc++.h> using namespace std; int n,m,total,num; bool isknow[101][101],ok[101],room[101]; void dfs(int i,int cur,bool sign,int f){//要把i个人安排到已经有cur人的房间,是否需要开下一个房间,现在已经安排好了的人数 if(sign){ memset(room,false,sizeof(room)); cur=0; ok[i]=true; room[cur]=i; num++; f++;//新开一个房间,房间数+1 ,安排的人数++ } if(f==n){//人员全部安排好了 return; } bool t=false; for(int j=0;j<cur;j++){ if(isknow[i][room[j]]){ t=true;//这个人和房间里面原有的人冲突 } }//第i个人能不能放在已经放了cur人的考场 if(t){ dfs(i,0,true,f++);//冲突,安排在下一个房间 } else{//不冲突,放在这个考场里面 ok[i]=true; room[cur]=i; for(int j=0;j<n;j++){ if(j!=i&&!ok[j]){ dfs(j,cur+1,false,f++); break; } } } } int main() { cin>>n>>m; memset(isknow,false,sizeof(isknow)); for(int i=0;i<m;i++){ int a,b; cin>>a>>b; isknow[a][b]=true; isknow[b][a]=true; } total=101;//100人最多需要100间考场 for(int i=1;i<=n;i++){ memset(ok,false,sizeof(ok)); num=0;//最少需要的房间数 ,已经安排的人数 dfs(i,0,true,0);//分别从每个人开始深度优先搜索 if(num<total) total=num; } cout<<"ac"<<total; return 0; }