• HDU6321 Dynamic Graph Matching【状压DP 子集枚举】


    HDU6321 Dynamic Graph Matching

    题意:

    给出(N)个点,一开始没有边,然后有(M)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配(k)对边的方案数有多少种<k = 1, 2, 3, cdots ,frac{n}{2}( )Nle 10, Mle 30000$

    题解:

    看到(N)的数据范围很容易想到状压DP,不可能对每次操作单独来计算,所以考虑计算每次操作后对答案的贡献,记(f[msk][k])为点集为(msk)的状态下匹配了(k)对点的方案数,可以发现,如果加入边(u,v),那么对总的匹配(kk)对点的答案的贡献为(f[msk^(1<<u)^(1<<v)][kk-1]),即固定选这条边的情况下的方案数,如果删边的话就减去贡献即可。
    加入边之后还要修改(f)数组,而影响到的(f)数组的(msk)中肯定包含了(u,v)这两个点,所以我们需要枚举包含(u,v)两个点的集合(msk),然后将(f[msk][i])减去(f[msk^(1<<u)^(1<<v)][i-1])即可
    注意初始化的时候(f[msk][0])都是(1)

    view code
    //#pragma GCC optimize("O3")
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<bits/stdc++.h>
    using namespace std;
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    const int MAXN = 10;
    typedef long long int LL;
    const LL MOD = 1E9+7;
    int n, m, ret[6];
    int f[1<<MAXN][6];
    void solve(){
        static char op[10];
        scanf("%d %d",&n,&m);
        memset(ret,0,24);
        for(int msk = 0; msk < (1<<n); msk++) for(int i = 0; i <= n / 2; i++) f[msk][i] = !i;
        while(m--){
            int u, v;
            scanf("%s %d %d",op,&u,&v);
            u--, v--;
            for(int i = 1; i <= n / 2; i++){
                ret[i] = (ret[i] + (op[0]=='+'?1:-1) * f[((1<<n)-1)^(1<<u)^(1<<v)][i-1]) % MOD;
                printf("%d%c",ret[i] = (ret[i] + MOD) % MOD," 
    "[i==n/2]);
            }
            int msk = ((1<<n)-1) ^ (1<<u) ^ (1<<v);
            int sub = msk;
            while(true){
                int mask = ((1<<n)-1) ^ sub;
                for(int i = 1; i <= 5; i++) f[mask][i] = (f[mask][i] + (op[0]=='+'?1:-1) * f[mask^(1<<u)^(1<<v)][i-1]) % MOD;
                if(!sub) break;
                sub = ((sub-1) & msk);
            }
        }
    }
    int main(){
        int tt;
        for(scanf("%d",&tt); tt; tt--) solve();
        return 0;
    }
    
  • 相关阅读:
    【小白学PyTorch】1 搭建一个超简单的网络
    【小白学PyTorch】2 浅谈训练集和测试集
    【小白学AI】GBDT梯度提升详解
    【小白学AI】XGBoost推导详解与牛顿法
    【小白写论文】技术性论文结构剖析
    小白学PyTorch 动态图与静态图的浅显理解
    【小白学推荐1】 协同过滤 零基础到入门
    【小白学AI】随机森林 全解 (从bagging到variance)
    OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体
    【python刷题】二叉搜索树-相关题目
  • 原文地址:https://www.cnblogs.com/kikokiko/p/13181924.html
Copyright © 2020-2023  润新知