Peaceful Teams

题目大意

将 \(n\) 个人分成 \(T\) 组,要求每组不能包含敌对的人,问有多少种分法。

思路分析

注意到 \(n,T\) 均很小,考虑爆搜。

注意到直接枚举会枚举到分组顺序的全排列,所以可以强行嵌定大小关系去重。

void dfs(int s){
if(s==n+1){
for(int i=1;i<=t;i++) if(!tt[i]) return ;
for(int i=2;i<=t;i++) if(sk[i-1][1]>sk[i][1]) return ;//去重
ans++;
return ;
}
for(int i=1;i<=t;i++){
int flag=0;
for(int j=1;j<=tt[i];j++) if(bad[sk[i][j]][s]){flag=1;break;}//判断敌对
if(flag) continue;
sk[i][++tt[i]]=s;
dfs(s+1);
tt[i]--;
}
}

正常搜索的时间复杂度为 \(O(T^n)\),无法通过,于是加一点点剪枝:

  • 如果当前人数小于当前的空组数,那么填到最后一定存在空组,直接返回。

  • 每次搜索都优先判定是否合法。

然后就飞过去了。

代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio> using namespace std;
const int N=110; int ans,n,t,m,in1,in2;
int bad[N][N],sk[N][N],tt[N]; void dfs(int s){
for(int i=2;i<=t;i++)
if(tt[i-1]&&tt[i]&&sk[i-1][1]>sk[i][1]) return ;
int cnt=0;
for(int i=1;i<=t;i++)
if(!tt[i]) cnt++;
if(n-s+1<cnt) return ;
if(s==n+1){
for(int i=1;i<=t;i++) if(!tt[i]) return ;
ans++;
return ;
}
for(int i=1;i<=t;i++){
int flag=0;
for(int j=1;j<=tt[i];j++) if(bad[sk[i][j]][s]){flag=1;break;}
if(flag) continue;
sk[i][++tt[i]]=s;
dfs(s+1);
tt[i]--;
}
} int main(){
scanf("%d%d%d",&n,&t,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&in1,&in2);
bad[in1][in2]=bad[in2][in1]=1;
}
dfs(1);
cout<<ans<<'\n';
return 0;
}

[ABC310D] Peaceful Teams 题解的更多相关文章

  1. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  2. 2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 几道简单题的题解

    A. Toda 2 题意:给你n个人,每个人的分数是a[i],每次可以从两个人到五个人的使得分数减一,使得最终的分数相等: 思路:假设答案为m:每个人的分数与答案m的差值为d[i],sum为d[i]的 ...

  3. CF1092B Teams Forming 题解

    Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...

  4. UVA 11609 Teams 组合数学+快速幂

    In a galaxy far far away there is an ancient game played among the planets. The specialty of the gam ...

  5. 浙大pat 1011题解

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  6. 10317 Fans of Footbal Teams(并查集)

    10317 Fans of Footbal Teams 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC Description ...

  7. 【CF1133E】K Balanced Teams(动态规划,单调队列)

    [CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...

  8. Codeforces Round #443 (Div. 1) B. Teams Formation

    B. Teams Formation link http://codeforces.com/contest/878/problem/B describe This time the Berland T ...

  9. Programming Contest Ranking(题解)

    Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...

  10. URAL题解一

    URAL题解一 URAL 1002 题目描述:一种记住手机号的方法就是将字母与数字对应,如图.这样就可以只记住一些单词,而不用记住数字.给出一个数字串和n个单词,用最少的单词数来代替数字串,输出对应的 ...

随机推荐

  1. .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)

    〇.前言 当把开发好的 WebApi 接口,部署到 Windows 服务器 IIS 后,postman 可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨 ...

  2. knn和线性分类器

    一.knn算法概述 knn首选是最简单的分类算法,其是有监督学习的分类算法之一. 二.knn算法过程 knn(k nearest neighbors k个最近的邻居):knn是当预测一个新的值x的时候 ...

  3. Codeforces Round #771 (Div. 2) A-E

    A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; int p[507]; bool solv ...

  4. 即构SDK9月迭代:外部采集、音频频谱、房间附加消息等多个模块功能上新

    即构SDK9月迭代来了,本月SDK在外部采集.音频频谱.房间附加消息等多个功能模块均有新功能上线,并且还针对K歌音乐场景下,优化了变调功能效果.以下是详细的迭代内容: LiveRoom   新增 1. ...

  5. Spring-Bean的依赖注入的数据类型

    Spring-Bean的依赖注入的数据类型 除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入 数据的三种数据类型 普通数据类型 引用数据类型 集合数据类型 普通数据类型 public ...

  6. UE4构建基础和实践:一、概述

    序言 构建这个概念是和应用程序包及资源等相关的,它的特点是使用脚本控制一系列的任务的处理,以减少人力操作带来的成本和操作失误风险. 在UE的概念里,构建往往是和打包相关的(如编译.cook.压缩打包等 ...

  7. OO第二次大作业

    前言 前言的前言 第二篇blog跟上一篇只隔了将近一个月,但是感觉心境上好像发生了很多的变化,认识到了自己存在的很多不足(可能是菜单折磨的),感觉对很多东西都一知半解,希望在写完这篇总结性blog之后 ...

  8. HTML的总结与回顾(思维导图

  9. 体验IntelliJ IDEA的远程开发(Remote Development)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 IDEA的远程开发功能,可以将本地的编译.构 ...

  10. MQ消息队列篇:三大MQ产品的必备面试种子题

    MQ有什么用? MQ(消息队列)是一种FIFO(先进先出)的数据结构,主要用于实现异步通信.削峰平谷和解耦等功能.它通过将生产者生成的消息发送到队列中,然后由消费者进行消费.这样,生产者和消费者之间就 ...