weinan030416

导航

算法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;
}

 

posted on 2023-03-28 20:28  楠030416  阅读(9)  评论(0编辑  收藏  举报