码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-06-23 15:37:14      阅读:46      评论:0      收藏:0      [点我收藏+]

标签:lang   stat   oid   link   const   bre   while   using   turn   

HDU6321 Dynamic Graph Matching

题意:

给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\(k\)对边的方案数有多少种<k = 1, 2, 3, \cdots ,\frac{n}{2}\( \)N\le 10, M\le 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," \n"[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;
}

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

标签:lang   stat   oid   link   const   bre   while   using   turn   

原文地址:https://www.cnblogs.com/kikokiko/p/13181924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!