HDU 6321 Dynamic Graph Matching (状压DP)

Problem C. Dynamic Graph Matching

Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)

Total Submission(s): 1796 Accepted Submission(s): 731

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 1,2,...,n. Initially the graph has no edges.

There are 2 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=1,2,3,...,n2. Note that multiple edges between same pair of vertices are considered different.

Input

The first line of the input contains an integer T(1≤T≤10), denoting the number of test cases.

In each test case, there are 2 integers n,m(2≤n≤10,nmod2=0,1≤m≤30000), denoting the number of vertices and operations.

For the next m lines, each line describes an operation, and it is guaranteed that 1≤u<v≤n.

Output

For each operation, print a single line containing n2 integers, denoting the answer for k=1,2,3,...,n2. Since the answer may be very large, please print the answer modulo 109+7.

Sample Input

1

4 8

+ 1 2

+ 3 4

+ 1 3

+ 2 4

- 1 2

- 3 4

+ 1 2

+ 3 4

Sample Output

1 0

2 1

3 1

4 2

3 1

2 1

3 1

4 2

题目解析

题意:给一个图有N个点和若干个询问,每个询问增或者删一条边,每个询问输出选择1~N/2条不相交的边的方案数。

题解:状压DP

代码

  1. #include<bits/stdc++.h>
  2. #define CLR(a,b) memset(a,b,sizeof(a))
  3. using namespace std;
  4. typedef long long ll;
  5. const int mod = 1e9 + 7;
  6. ll dp[1<<10];
  7. ll ans[6];
  8. int main()
  9. {
  10. // freopen("c.in","r",stdin);
  11. // freopen("ans.txt","w",stdout);
  12. int t,n,m,x,y,cnt;
  13. ll tmp;
  14. char s[2];
  15. scanf("%d",&t);
  16. while(t--){
  17. scanf("%d%d",&n,&m);
  18. CLR(ans,0);
  19. CLR(dp,0);
  20. dp[0] = 1;
  21. for(int i = 1; i <= m; i++){
  22. scanf("%s %d %d",s,&x,&y);
  23. if( s[0] == '+'){
  24. for(int i = 0;i < (1<<n); i++){
  25. if((i&(1<<(x-1))) && (i&(1<<(y-1)))){
  26. tmp = dp[i];
  27. dp[i] = (dp[i] + dp[(i^(1<<(x-1))^(1<<(y-1)))])%mod;
  28. cnt = 0;
  29. for(int j = 0; j < n; j++){
  30. if(i&(1<<j)) cnt++;
  31. }
  32. ans[cnt/2] = (ans[cnt/2] + (dp[i]-tmp)%mod + mod )%mod;
  33. }
  34. }
  35. }
  36. if( s[0] == '-'){
  37. for(int i = 0;i < (1<<n); i++){
  38. if((i&(1<<(x-1))) && (i&(1<<(y-1)))){
  39. tmp = dp[i];
  40. dp[i] = (dp[i]-dp[(i^(1<<(x-1))^(1<<(y-1)))] + mod)%mod;
  41. cnt = 0;
  42. for(int j = 0; j < n; j++){
  43. if(i&(1<<j)) cnt++;
  44. }
  45. ans[cnt/2] = (ans[cnt/2]+(dp[i]-tmp)%mod + mod)%mod;
  46. }
  47. }
  48. }
  49. printf("%d",ans[1]%mod);
  50. for(int i = 2; i <= n/2; i++){
  51. printf(" %d",ans[i]%mod);
  52. }
  53. printf("\n");
  54. }
  55. }
  56. return 0;
  57. }
  58. /*
  59. 1
  60. 4 8
  61. + 1 2
  62. + 3 4
  63. + 1 3
  64. + 2 4
  65. - 1 2
  66. - 3 4
  67. + 1 2
  68. + 3 4
  69. */

HDU 6321 Dynamic Graph Matching的更多相关文章

  1. hdu多校第3场C. Dynamic Graph Matching

    Problem C. Dynamic Graph Matching Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Tot ...

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

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

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

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

  4. 【hdu 6321】Dynamic Graph Matching

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] DP 设f[i][j]表示前i个操作,已经匹配了的点的状态集合为j的方案数 对于+操作 有两种情况. 1.这条边作为匹配的边 2.这 ...

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

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

  6. [HDU6321]Dynamic Graph Matching(DP)

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

  7. 论文阅读笔记(十七)【ICCV2017】:Dynamic Label Graph Matching for Unsupervised Video Re-Identification

    Introduction 文章主要提出了 Dynamic Graph Matching(DGM)方法,以非监督的方式对多个相机的行人视频中识别出正确匹配.错误匹配的结果.本文主要思想如下图: 具体而言 ...

  8. Deep Learning of Graph Matching 阅读笔记

    Deep Learning of Graph Matching 阅读笔记 CVPR2018的一篇文章,主要提出了一种利用深度神经网络实现端到端图匹配(Graph Matching)的方法. 该篇文章理 ...

  9. Dynamic Route Matching Vue路由(1)

    Dynamic Route Matching 动态的 路由 匹配 Very often we will need to map routes with the given pattern to the ...

随机推荐

  1. 【hdu 5632】Rikka with Array

    Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Ri ...

  2. PHP中ajax返回数据类型为JSON数据的处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JS中小数相加相减时出现很长的小数点的解决方式

    1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002, ...

  4. 《Java编程思想第四版完整中文高清版.pdf》-笔记

    D.2.1 安插自己的测试代码 插入下述“显式”计时代码,对程序进行评测: long start = System.currentTimeMillis(); // 要计时的运算代码放在这儿 long ...

  5. 智联python 技能摘取

  6. 第六节,Python的科学计算包——Numpy

    1.基本类型(array) import numpy as np a=[1,2,3,4] b=np.array(a) #array([1,2,3.4]) type(b) #<type 'nump ...

  7. iOS UIPrintInteractionController在iPad的 iOS10 和 11上的奇怪bug

    今天在弹出UIPrintInteractionController的时候,在ios10 和11的ipad 上测试,发现一直是protrait 方向弹出,结果就出现如下图的bug: 研究了好长时间,发现 ...

  8. Java_Runtime&Process&ProcessBuilder

    目录 一.Runtime类 二.Process类 三.ProcessBuilder类 在Java中想调用外部程序,或者执行命令和可运行文件时,网上的典型实例一般都是通过Runtime.getTime( ...

  9. 数位dp-入门模板题 hdu2089

    #include<bits/stdc++.h> using namespace std; ][],n,m; void init(){//dp[i][j]:i位的数,最高位是j dp[][] ...

  10. angular 2+ 变化检测系列二(检测策略)

    我们将创建一个简单的MovieApp来显示有关一部电影的信息.这个应用程序将只包含两个组件:显示有关电影的信息的MovieComponent和包含执行某些操作按钮的电影引用的AppComponent. ...