abc310D 带限制的分组方案数
将n个人分成T组,有m条限制条件,第i个条件为{a[i],b[i]},表示a[i]与b[i]不能分到同一组,问总共有多少种可行的分组方案?
1<=T<=n<=10
分析:最多只有10人,直接爆搜也能过,可以再加个剪枝:如果剩下人每人单独一组都不够T组则不可行。另外,为了去重,可以按编号从小到大的顺序,依次考虑每个人,要么加到已有的组里,要么自成一组。
#include <bits/stdc++.h>
using i64 = long long;
i64 n, T, m, ans;
std::set<i64> g[15];
std::set<std::pair<i64,i64>> forbid;
void dfs(i64 x, i64 t) {
if (x > n) {
if (t == T) {
ans += 1;
}
return;
}
if (t > T) {
return;
}
if (n - x + 1 + t < T) {
return;
}
for (int i = 1; i <= t; i++) {
int ok = 1;
for (auto i : g[i]) {
i64 j = x;
if (i > j) {
swap(i, j);
}
if (forbid.count({i,j})) {
ok = 0;
}
}
if (ok) {
g[i].insert(x);
dfs(x + 1, t);
g[i].erase(x);
}
}
g[t + 1].insert(x);
dfs(x + 1, t + 1);
g[t + 1].erase(x);
}
void solve() {
std::cin >> n >> T >> m;
for (int i = 1; i <= m; i++) {
i64 a, b;
std::cin >> a >> b;
if (a > b) {
std::swap(a, b);
}
forbid.insert({a,b});
}
dfs(1, 0);
std::cout << ans << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}
浙公网安备 33010602011771号