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 子集枚举】的更多相关文章

  1. HDU - 6321 Problem C. Dynamic Graph Matching (状压dp)

    题意:给定一个N个点的零图,M次操作,添加或删除一条边,每一次操作以后,打印用1,2,...N/2条边构成的匹配数. 分析:因为N的范围很小,所以可以把点的枚举状态用二进制表示集合.用一维数组dp[S ...

  2. [HDU6321]Dynamic Graph Matching(DP)

    题意:给定一个n个点的无向图,开始没有边,然后m个操作,每次加边或者删边,每次操作后输出正好k个边的匹配数k=1,2,3,...n/2,n<=10,m<=30000 可以发现,n<= ...

  3. UOJ #348 州区划分 —— 状压DP+子集卷积

    题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...

  4. codeforces1209E2 状压dp,枚举子集

    题意 给一个n行m列的矩阵,每一列可以循环移位,问经过任意次移位后每一行的最大值总和最大为多少. 分析 每一行的最大值之和最大,可以理解为每一行任意选择一个数使它们的和最大. 设\(dp[i][S]\ ...

  5. HDU6321 Dynamic Graph Matching (杭电多校3C)

    给出一些点集,然后对于每一次要求给出的这些点集里的1,2,3,4,5,6....n/2的匹配数, dp[i][j] 表示到第i次操作里点集为j的匹配数,然后我每次加入一条边u-v,我的状态就是 dp[ ...

  6. 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态

    题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...

  7. HDU 6321 Dynamic Graph Matching

    HDU 6321 Dynamic Graph Matching (状压DP) Problem C. Dynamic Graph Matching Time Limit: 8000/4000 MS (J ...

  8. 【NOIP2017】宝藏 题解(状压DP)

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...

  9. [Poj2411]Mondriaan's Dream(状压dp)(插头dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18096   Accepted: 103 ...

随机推荐

  1. EasyUI 表单插件 multiline easyui-textbox 多行换行失效问题

    1.问题描述:原始html: <input class="easyui-textbox" name="myname" id="myid" ...

  2. python virtualenv 基本使用

    下载 pip install virtualenv 校验是否成功 virtualenv --version 使用 创建env环境 要写一个新项目,使用env先创建环境 cd xx\xx\xx\ # 进 ...

  3. C语言实现蛇形矩阵

    今天大一考试C语言的时候看见了这道题,下面是我转载的一个大佬的博客,自认为分析的很清楚,特来分享一下. **原文地址: https://blog.csdn.net/jack22333/article/ ...

  4. 【Java】流程控制 - 顺序结构、 选择(分支)结构(单分支、双分支、多分支、嵌套)、循环结构(for、while、do...while)、跳转语句(break、continue)

    流程控制语句结构 文章目录 流程控制语句结构 一. 顺序结构 1. 输出语句 2. 输入语句 3.code 二.复合语句 三. 分支结构 1. 条件判断 1.单分支结构 2.双分支结构 3.多分支结构 ...

  5. 基于numpy.einsum的张量网络计算

    张量与张量网络 张量(Tensor)可以理解为广义的矩阵,其主要特点在于将数字化的矩阵用图形化的方式来表示,这就使得我们可以将一个大型的矩阵运算抽象化成一个具有良好性质的张量图.由一个个张量所共同构成 ...

  6. 【Linux】以001格式循环到100保证位数是3位

    这里有一个前提,要保证数位是相同的 确实数字是1-100  但是数位是不同的,需要统一一下位数必须是3位的 这个问题在很多论坛上用的都是printf这个命令,确实可以达到这个效果,但是没有我下面介绍的 ...

  7. 【ORA】ORA-27101快速处理方法

    今天朋友的数据库出了问题,报错如下: 这个问题主要是是spfile和pfile文件不一致导致的, 生成一个pfile,完了用pfile启动数据库即可 SQL> create pfile '/ho ...

  8. 24V降压5V芯片,5A,4.5V-30V输入,同步降压调节器

    PW2205开发了一种高效率的同步降压DC-DC转换器5A输出电流.PW2205在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失.PW2205采 ...

  9. Q-Q图原理详解及Python实现

    [导读]在之前的<数据挖掘概念与技术 第2章>的文章中我们介绍了Q-Q图的概念,并且通过调用现成的python函数, 画出了Q-Q图, 验证了Q-Q图的两个主要作用,1. 检验一列数据是否 ...

  10. 注入器(injector)

    1.0    注入器/injector 注入器是AngularJS框架实现和应用开发的关键,这是一个DI/IoC容器的实现. AngularJS将功能分成了不同类型的组件分别实现,这些组件有一个统称 ...