Problem C. Dynamic Graph Matching

Time Limit: / MS (Java/Others)    Memory Limit: / K (Java/Others)
Total Submission(s): Accepted Submission(s): Problem Description
In the mathematical discipline of graph theory, a matching in a graph is a set of edges without common vertices.
You are given an undirected graph with n vertices, labeled by ,,...,n. Initially the graph has no edges.
There are kinds of operations :
+ u v, add an edge (u,v) into the graph, multiple edges between same pair of vertices are allowed.
- u v, remove an edge (u,v), it is guaranteed that there are at least one such edge in the graph.
Your task is to compute the number of matchings with exactly k edges after each operation for k=,,,...,n2. Note that multiple edges between same pair of vertices are considered different. Input
The first line of the input contains an integer T(≤T≤), denoting the number of test cases.
In each test case, there are integers n,m(≤n≤,nmod2=,≤m≤), denoting the number of vertices and operations.
For the next m lines, each line describes an operation, and it is guaranteed that ≤u<v≤n. Output
For each operation, print a single line containing n2 integers, denoting the answer for k=,,,...,n2. Since the answer may be very large, please print the answer modulo +. Sample Input +
+
+
+
-
-
+
+ Sample Output Source
Multi-University Training Contest Recommend
chendu Statistic | Submit | Discuss | Note

装压dp

+:操作很简单就是:dp[i]+=dp[i-(1<<u)-(1<<v)];

-:操作就想象成反的: dp[i]-=dp[i-(1<<u)-(1<<v)];拿总的减去用到用到u,v

类似于背包某个物品不能放;

#include <cstdio>
#include <cstring>
#include <iostream>
//#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
//#define mod 998244353
const int mod=1e9+; ll dp[<<];//dp[i]:i集合内点完全匹配的方案数
int bit[<<];//i的二进制的1个数;
ll ans[];
int lowbit(int x) {return x&-x;}
int calc(int x)
{
int res=;
while(x){res++;x=x-lowbit(x);}
return res;
}
int main()
{
for(int i=;i<(<<);i++)
bit[i]=calc(i);
int T,n,m,u,v;
char op[];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(dp,,sizeof dp);
memset(ans,,sizeof ans);
dp[]=;
while(m--)
{
scanf("%s%d%d",op,&u,&v);
u--;v--;
if(op[]=='+')
{
for(int i=(<<n)-;i>;i--)
if(((<<u)&i)&&((<<v)&i))
{
dp[i]+=dp[i-(<<u)-(<<v)];
ans[bit[i]]+=dp[i-(<<u)-(<<v)]; //对于i集合所有点的匹配,会对ans造成的影响
dp[i]=dp[i]%mod;
ans[bit[i]]=ans[bit[i]]%mod;
}
} else
{
for(int i=;i<<<n;i++)
if(((<<u)&i)&&((<<v)&i))
{
dp[i]-=dp[i-(<<u)-(<<v)];
ans[bit[i]]-=dp[i-(<<u)-(<<v)];
dp[i]=(dp[i]+mod)%mod;
ans[bit[i]]=(ans[bit[i]]+mod)%mod;
}
}
for(int i=;i<=n;i=i+)
{
if(i!=)
cout<<" ";
printf("%lld",ans[i]); }
cout<<endl; } } return ;
}

hdu多校第3场C. Dynamic Graph Matching的更多相关文章

  1. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  2. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  3. hdu多校第三场

    Problem D. Euler Function 思路:打表找找规律. #include<bits/stdc++.h> #define LL long long #define fi f ...

  4. HDU 6321 Dynamic Graph Matching

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

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

    HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...

  6. HDU多校训练第一场 1012 Sequence

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=6589 题意:给出一个长度为n的数组,有m次操作,操作有3种1,2,3,问操作m次后的数组,输出i*a[i]的异或和 ...

  7. hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力

    题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...

  8. Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元

    题意大致是有n个苹果,问你最多拿走m个苹果有多少种拿法.题目非常简单,就是求C(n,0)+...+C(n,m)的组合数的和,但是询问足足有1e5个,然后n,m都是1e5的范围,直接暴力的话肯定时间炸到 ...

  9. 2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

    听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到10 ...

随机推荐

  1. python框架之Django(15)-contenttype模块

    假如有一个书城系统,需要给作者和书籍加上评论功能.如果给每个表单独建一个评论表,那么我们以后要扩展其它模块评论功能的时候,还需要随之新建一张评论表,会显得很冗余.对于这种情况,Django 给我们提供 ...

  2. 小程序自定义tabBar,动态控制tabBar

    最近做项目的时候,突然来了个小特殊的需求,根据客户的类型来动态显示底部的tabBar菜单.当时我就有点小懵逼了,这个不是小程序自带的组件么?还要做成动态?这就有点尴尬了..... 不过也只是一时尴尬而 ...

  3. PHP环境安全加固

    随着使用 PHP 环境的用户越来越多,相关的安全问题也变得越来越重要.PHP 环境提供的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如system() ...

  4. centos----------centos下如何安装phpstorm

    1.首先打开centos下的谷歌浏览器,找到phpstorm官网下载linux版本.PhpStorm-2016.3.2.tar.gz 2.然后gunzip PhpStorm-2016.3.2.tar. ...

  5. git----------git:如何让git识别我修改了文件夹名字和文件名字的大小写问题。

    修改每个项目里面的隐藏的.git文件里面的config文件.将箭头指的原本是true改成false.

  6. make pycaffe时候报错:Makefile:501: recipe for target 'python/caffe/_caffe.so' failed

    安装caffe-ssd编译环境的时候报错: python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: No such file ...

  7. word之高级

    1.更正拼写和语法错误. 2.取消自动编号. 3.添加删除水印. 4.段落设置首行缩进2个字符. 需要先选中需要设置的段落 5.文字覆盖. insert键切换插入与改写功能.修改word状态栏上的改写 ...

  8. sublime lincense for linux

    sublime lincense for linux Sublime Text 3.x (after Build 3133) —– BEGIN LICENSE —–TwitterInc200 User ...

  9. Zookeeper应用之——栅栏(barrier)

    Zookeeper应用之——栅栏(barrier) 栅栏(barrier)简介 barrier的作用是所有的线程等待,知道某一时刻,锁释放,所有的线程同时执行.举一个生动的例子,比如跑步比赛,所有 运 ...

  10. 第八篇——Struts2的处理结果类型

    Struts2处理结果类型 1.SUCCESS:表示Action正确的执行完成,返回相应的视图,success是name属性的默认值: 2.ERROR:表示Action执行失败,返回到错误处理视图: ...