杭电多校第三场1003 C. 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): 388    Accepted Submission(s): 148


 

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

 

Source

2018 Multi-University Training Contest 3

 

Recommend

chendu   |   We have carefully selected several similar problems for you:  6331 6330 6329 6328 6327 

 

Statistic | Submit | Discuss | Note

【小结】

总碰到状压dp,总是束手无策。因为我菜。

【题意】

有一个n点的无向图,初始时没有边,有m次操作,每次可以增加或删除一条边(注意,允许重边的存在)

要求每一次操作之后,输出匹配数分别为1,2,3...n/2的方案数。

匹配是指:选中一些边,使得两两没有公共点,即每两个点可以通过边匹配起来。

【分析】

二进制表示集合,对于状态 i 的每一位,为1则选中,为0则不属于当前集合。

dp[i] 表示i状态,集合内所有点都匹配了 的 方案数。

那么当添加边u-v时,所有同时包含 uv 的状态 S 需要更新,dp[S] += dp[S-u-v]  (S-u-v表示状态S去掉u和v的状态)

更新dp[i] 时,需要考虑更新时会对答案产生的贡献。

【代码】

/****
***author: winter2121
****/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int MAX=2e5+5;

ll dp[1<<11]; //dp[i]:i集合内点完全匹配的方案数
int bit[1<<11]; //i的二进制的1的个数
ll ans[11];
void adjust(ll &x){x=(x%mod+mod)%mod;}
int calc(int x)
{
    int res=0;
    while(x)res++,x-=x&-x;
    return res;
}
int main()
{
    for(int i=0;i<1<<10;i++)bit[i]=calc(i);
    int T,n=10,m,u,v;
    char op[3];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        memset(dp,0,sizeof(dp));
        memset(ans,0,sizeof(ans));
        dp[0]=1;
        while(m--)
        {
            scanf("%s%d%d",op,&u,&v);u--,v--;
            if(op[0]=='+')
            {
                for(int i=(1<<n)-1;i>0;i--)if(((1<<u)&i)&&((1<<v)&i))
                {
                    dp[i]+=dp[i-(1<<u)-(1<<v)];
                    ans[bit[i]]+=dp[i-(1<<u)-(1<<v)]; //对于i集合所有点的匹配,会对ans造成的影响
                    adjust(dp[i]);
                    adjust(ans[bit[i]]);
                }
            }
            else
            {
                for(int i=1;i<1<<n;i++)if(((1<<u)&i)&&((1<<v)&i))
                {
                    dp[i]-=dp[i-(1<<u)-(1<<v)];
                    ans[bit[i]]-=dp[i-(1<<u)-(1<<v)];
                    adjust(dp[i]);
                    adjust(ans[bit[i]]);
                }
            }

            for(int i=2;i<=n;i+=2)
                printf("%lld%c",ans[i],i==n?'\n':' ');
        }
    }
    return 0;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
近日,DeepMind 和谷歌联合进行了一项研究,该研究提出了一种执行相似性学习的新型强大模型——匹配网络(GMN),性能优于 GNN 和 GCN 模型。该论文已被 ICML 2019 接收。 DeepMind 和谷歌的这项新研究聚焦检索和匹配结构对象这一极具挑战性的问题,做出了两个重要贡献。 首先,研究者展示了如何训练神经网络(GNN),使之生成可在向量空间中执行高效相似性推理的嵌入。其次,研究者提出了新型匹配网络模型(GMN),该模型以一对作为输入,通过基于跨注意力的新型匹配机制进行联合推理,从而计算它们之间的相似性分数。 研究者证明 GMN 模型在不同领域中的有效性,包括极具挑战性的基于控制流的函数相似性搜索问题,这个问题在检索软件系统的漏洞中起着非常重要的作用。实验分析表明 GMN 模型不止能在相似性学习的环境下利用结构,还能超越针对这些问题手动精心设计的特定领域基线系统。研究主题:相似性学习问题 是编码关系结构的自然表征,常常出现在多个领域中。根据结构数据定义的计算可以用在各种领域中,从计算生物学和化学的分子分析到自然语言理解中知识结构解析的分析都可以。 近几年来,神经网络(Graph Neural Network,GNN)已经成为可以有效学习结构数据表征、解决各种基于的监督预测问题的模型了。这样的模型在迭代聚合局部结构信息的传播过程中设计并计算节点表征,从而对元素的排列(permutation)具有不变性。然后直接将这些节点表征用于节点分类,或者将它们合并到用于分类的向量中。而 GNN 在监督分类或回归以外的问题的相关研究相对较少。 DeepMind 的这篇论文研究的是结构对象的相似性学习问题,这个问题在现实生活中有很多重要的应用,尤其是在数据库中基于相似性的搜索。还有一个应用是涉及计算机安全的二元函数相似性搜索,给定的二元函数可能包含有已知漏洞的代码,我们要检查这个二元函数中是否有和已知易受攻击的函数相似的控制流(control-flow-graph)。这有助于识别闭源软件中易受攻击的静态连结函式库,这是一个很常见的问题 (CVE, 2010; 2018),现在还没有很好的解决方法。 1 展示了一个例子,在这个例子中用汇编语言注释的控制流来表示二元函数。这种相似性学习问题极具挑战性,因为就算是之间细微的差别也会造成语义上极大的不同,但结构不同的语义上可能非常相似。因此,对这个问题而言,一个成功的模型应该(1)利用结构;(2)能从的结构和学习到的语义中推导出的相似性。 1:二元函数相似性学习问题。检查两个是否相似需要推理的结构和语义。左边两个控制流对应使用不同编译器编译的相同函数(因此二者比较相似),但右侧对应的是不同函数。 解决方案 为了解决相似性学习问题,该论文研究了 GNN 在这种情况中的使用,探讨了如何用 GNN 将嵌入到向量空间,并学习这种嵌入模型,从而使向量空间中相似的靠近、不相似的分开。这个模型的一个重要特性是它可以将每一个独立地映射到一个嵌入向量,然后在向量空间中执行相似性计算。因此,可以预先计算并索引大型数据库中的嵌入,这样就能用快速的最近邻搜索数据结构(如 k-d 树) 或局部敏感哈希算法 (Gionis et al., 1999) 执行高效的检索。 研究者进一步扩展 GNN,提出新型匹配网络(Graph Matching Networks,GMN)来执行相似性学习。GMN 没有单独计算每个表征,它通过跨注意力机制计算相似性分数,来关联之间的节点并识别差异。该模型依赖成对计算表征,因此它比嵌入模型更强大,并在准确率和计算之间做出了很好的权衡。 研究者在三个任务上评估了 GMN 和基线模型:仅捕获结构相似性的合成编辑距离学习任务(synthetic graph edit-distance learning tas),以及两个现实世界任务——二元函数相似性搜索和网格检索,这两项任务都需要推理结构相似性和语义相似性。在所有任务中,GMN 都比基线和结构不可知(structure agnostic)模型的性能更好。在更详细的模型简化测试中,研究者发现 GMN 始终优于嵌入模型和 Siamese 网络。 该研究的贡献如下: 展示了如何用 GNN 产生用于相似性学习的嵌入; 提出了新型匹配网络(GMN),该网络基于跨注意力匹配来计算相似性; 实验证明,该研究提出的相似性学习模型 GMN 在多个应用中都有良好的表现,比结构不可知模型和现有的手动建立的基线模型都要好。 深度相似性学习 给定两个 G1 = (V1, E1) 和 G2 = (V2, E2),我们需要一个可以计算两之间相似性分数 s(G1, G2) 的模型。每个 G = (V, E) 被表示为节点 V 和边 E 的集合,每个节点 i∈V 都可以和特征向量 x_i 相关联,每条边 (i, j) ∈ E 都可以和特征向量 x_ij 关联起来。这些特征可以表示节点类型、边的方向等。如果一个节点或者一条边不能关联任何特征,那么我们可以将对应向量设置成值为 1 的常量。研究者提出了两个相似性学习模型:一个是基于标准 GNN 的学习嵌入的模型;另一个是更为崭新也更加强大的 GMN。 2 展示了这两个模型:嵌入模型 嵌入模型可以将每一个都嵌入到向量中,然后用向量空间中的相似性矩阵衡量之间的相似性。GNN 嵌入模型包括三个部分:编码器、传播层和聚合器。 匹配网络 匹配网络以一对作为输入,计算它们之间的相似性分数。和嵌入模型相比,匹配模型联合成对计算相似性分数,而不是先将每个独立地映射到向量上。因此,匹配模型可能比嵌入模型更加强大,但它需要额外的计算效率。 匹配网络改变了每个传播层中的节点更新模块,这样不仅可以考虑到每个的边上的聚合信息,还可以考虑到衡量一个中的一个节点和其他中的一或多个节点匹配近日,DeepMind 和谷歌联合进行了一项研究,该研究提出了一种执行相似性学习的新型强大模型——匹配网络(GMN),性能优于 GNN 和 GCN 模型。该论文已被 ICML 2019 接收。 程度的跨匹配向量:以调整的表征,在它们不匹配时放大它们之间的差异。 实验 研究者在三个任务上评估了相似性学习(Graph Similarity Learning,GSL)框架、嵌入模型(GNN)以及匹配网络(GMN)的性能,并将这些模型与其他方法进行了对比。总体上,实验结果表明在相似性学习任务上,GMN 表现优异,而且始终优于其他方法。 学习编辑距离(GED) G1 和 G2 之间的编辑距离即将 G1 变换为 G2 所需的最小编辑操作。通常这些编辑操作包括添加/移除/替换节点和边。编辑距离是衡量之间相似性的自然指标,在相似性搜索中有很多应用。 从下表 1 中可以看出,通过学习特定分布的,GSL 模型的性能优于一般的基线模型,而 GMN 的性能持续优于嵌入模型(GNN)。基于控制流的二元函数相似性搜索 二元函数相似性搜索是计算机安全领域中的重要问题。当我们无法获取源代码时,可以通过二元函数执行分析和搜索,例如在处理商业或嵌入式软件或可疑的可执行程序时。 下 4 展示了具备不同传播步和不同数据设置的不同模型在二元函数相似性搜索任务上的性能。从中,我们可以看到: 嵌入模型和匹配模型的性能随着传播步的增加而持续提升; 在传播步足够的情况下,嵌入模型持续优于基线模型; 匹配模型在所有设置和传播步的情况下都优于嵌入模型。研究者检测了GMN 模型中不同组件的效果,并将 GMN 模型与卷积网络(GCN)、神经网络(GNN)和 GNN/GCN 嵌入模型的 Siamese 版本进行对比。 下表 2 展示了实验结果,表明: GNN 嵌入模型是具备竞争力的模型(比 GCN 模型强大); 使用 Siamese 网络架构基于表征学习相似性要比使用预先指定的相似性指标(Euclidean、Hamming 等)好; GMN 优于Siamese 模型,这表明在计算过程早期进行跨信息交流是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪的期许

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值