chenfy27的刷题记录

导航

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;
}

posted on 2024-03-27 18:25  chenfy27  阅读(22)  评论(0)    收藏  举报