[ABC310D] 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 题解的更多相关文章
- codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解
秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...
- 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]的 ...
- CF1092B Teams Forming 题解
Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...
- UVA 11609 Teams 组合数学+快速幂
In a galaxy far far away there is an ancient game played among the planets. The specialty of the gam ...
- 浙大pat 1011题解
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...
- 10317 Fans of Footbal Teams(并查集)
10317 Fans of Footbal Teams 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description ...
- 【CF1133E】K Balanced Teams(动态规划,单调队列)
[CF1133E]K Balanced Teams(动态规划,单调队列) 题面 CF 让你把一堆数选一些出来分成不超过\(K\)组,每一组里面的最大值和最小值之差不超过\(5\),求最多有多少个人元素 ...
- 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 ...
- Programming Contest Ranking(题解)
Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...
- URAL题解一
URAL题解一 URAL 1002 题目描述:一种记住手机号的方法就是将字母与数字对应,如图.这样就可以只记住一些单词,而不用记住数字.给出一个数字串和n个单词,用最少的单词数来代替数字串,输出对应的 ...
随机推荐
- 续《基于C# 开发的SOL SERVER 操作数据库类(SQLHelp》 ——第二弹
续上一节,本节给出SQLHelp的具体实现方法--<YSFSQLHelp>,个人根据自己需要新建适合的类,本节根据参考网上资料,根据自己的需要编写的SQL帮助类.下面直接给出具体实现: / ...
- 屏蔽CSDN百度广告
最近在查询一些技术问题访问到CSDN时一直弹一些令人作恶的广告,说个特别的广告,脱发广告,特别有针对性程序员同胞们的共性问题,不过还是特别恶心,百度了一下,大家也特别反感,CSDN你真这么缺钱?废话不 ...
- 每日一题 力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/
力扣 1377 https://leetcode.cn/problems/frog-position-after-t-seconds/ 这道题目用dp去做,构建邻接矩阵,做的时候需要注意题目条件,如果 ...
- 2022蓝桥杯B组(java)版
2022蓝桥杯b组 A题 import java.math.BigInteger; public class A { public static void main(String[] args) { ...
- Python 运行 shell 命令的一些方法
哈喽大家好,我是咸鱼 我们知道,python 在自动化领域中被广泛应用,可以很好地自动化处理一些任务 就比如编写 Python 脚本自动化执行重复性的任务,如文件处理.数据处理.系统管理等需要运行其他 ...
- Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: java.net.ConnectException: 拒绝连接 (Connection refused) (state=08S01,code=0)
一:启动hiveserver2服务 二:启动beeline 三:连接hiveserver2(下面的1000000端口号适当改小写因为其超出最大端口号的范围建议改为10000) 如果启动不成功实现我们先 ...
- 输入平方米的三种方式㎡ m2 m²
如何在Word中输入平方米字符? 第1种方法 Win10自带输入法,输入"平方米",默认第5个就出来了㎡,也可以直接复制使用. 这种方式最直接,字母m和右上角的2是1个字符,所以不 ...
- 明白error类型让你更快定位开发报错
在javascript中,开发遇到的项目报错,很多时候都是通过 Error 这个类来展示的,清楚Error的类型可以更好定位项目中的问题 Error的类型 Error Error是所有其它错误的父类, ...
- [ABC148F] Playing Tag on Tree
2023-03-04 题目 题目传送门 翻译 翻译 难度&重要性(1~10):5 题目来源 AtCoder 题目算法 最短路 解题思路 考虑到 T 想活得久, A 想尽早追上 T ,所以我们就 ...
- Go 上下文的理解与使用
为什么需要 context 在 Go 程序中,特别是并发情况下,由于超时.取消等而引发的异常操作,往往需要及时的释放相应资源,正确的关闭 goroutine.防止协程不退出而导致内存泄露.如果没有 c ...