D题:Peaceful Teams
标签:深搜
d
f
s
dfs
dfs、状压
d
p
dp
dp
题意:给定
n
n
n个运动员要分成
t
t
t只队伍(每只队伍至少
1
1
1人),并且给定
m
m
m个矛盾关系
a
i
a_i
ai运动员和
b
i
b_i
bi运动员,分成的队伍中两两运动员之间不能有矛盾,求满足条件的方法数有多少种。
题解:
n
<
=
10
n<=10
n<=10,考虑直接暴力搜索,暴力搜索的过程中需要考虑把第
i
i
i个人是分到新的一只队伍里面还是放在原来的前
m
x
mx
mx只队伍里面,通过这样可以降低时间复杂度,不然如果选择把每个人往
1
−
t
1-t
1−t只队伍里面放一边,时间复杂度太高了。最后把第
n
n
n个人处理完之后,检测一下是否有矛盾冲突的情况。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, t, m, a[50], b[50], vis[50], ans = 0;
void dfs(int k, int mx) {
if (k == n + 1) {
if (mx != t) return ;
for (int i = 1; i <= m; i++) {
if (vis[a[i]] == vis[b[i]]) return ;
}
ans++;
return;
}
for (int i = 1; i <= mx + 1; i++) {
vis[k] = i;
dfs(k + 1, max(i, mx));
vis[k] = 0;
}
}
int main() {
cin >> n >> t >> m;
for (int i = 1; i <= m; i++)
cin >> a[i] >> b[i];
dfs(1, 0);
cout << ans;
return 0;
}