zoukankan      html  css  js  c++  java
  • 分考场

    分考场

    问题描述:

    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
    

    思路:

    深度优先搜索,途中加上简单剪枝。

    /**********************************************************
    * @Author: 			   .Sunbeam
    * @Date:   			   2020-03-20 12:55:42
    * @Last Modified by:   .Sunbeam
    * @Last Modified time: 2020-03-20 13:10:58
    * @Remark: 
    **********************************************************/
    #include <bits/stdc++.h>
    #define lowbit(x) (x&(-x))
    #define CSE(x,y) memset(x,y,sizeof(x))
    #define INF 0x3f3f3f3f
    #define Abs(x) (x>=0?x:(-x))
    #define FAST ios::sync_with_stdio(false);cin.tie(0);
    using namespace std;
    
    typedef long long ll;
    typedef pair<int,int> pii;
    typedef pair<ll , ll> pll;
    
    const int maxn=111;
    int fid[maxn][maxn],room[maxn][maxn];
    int n,m,ar[maxn],ans=INF;
    
    void dfs(int ad,int num){
    	if(ad>n){
    		ans=min(ans,num);
    		return;
    	}
    	if(num>=ans) return;
    	for(int i=0;i<num;i++){
    		bool fl=true;
    		for(int j=0;j<ar[i];j++){
    			if(fid[ad][room[i][j]]==1){
    				fl=false;
    				break;
    			}
    		}
    		if(fl){
    			room[i][ar[i]++]=ad;
    			dfs(ad+1,num);
    			ar[i]--;
    		}
    	}
    	room[num][ar[num]++]=ad;
    	dfs(ad+1,num+1);
    	ar[num]--;
    	return;
    }
    
    int main()
    {
    	#ifndef ONLINE_JUDGE
    	freopen("in.in","r",stdin);
    	#endif
    	FAST;
    	cin>>n>>m;
    	CSE(fid,0);
    	CSE(room,0);
    	CSE(ar,0);
    	for(int i=0;i<m;i++){
    		int a,b;
    		cin>>a>>b;
    		fid[a][b]=fid[b][a]=1;
    	}
    	dfs(1,0);
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    Android MediaPlayer
    MediaPlayer基本使用方式
    css 透明度 一句话搞定透明背景!
    CSS ZOOM 作用[IE6下清除浮动]
    document.execcommand方法
    让position:fixed在IE6下可用
    CSS文档流与块级元素(block)内联元素(inline)那点事
    Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)
    重载的乐趣
    线程间调用不同线程创建的控件
  • 原文地址:https://www.cnblogs.com/LeafLove/p/12531099.html
Copyright © 2011-2022 走看看