C. Dynamic Graph Matching

C. Dynamic Graph Matching

题意

给定一个 n 个点的无向图,m 次加边或者删边操作。
在每次操作后统计有多少个匹配包含 k = 1, 2, …,n/2 条边。
匹配的定义: 边的集合,没有共同的顶点

分析

先把匹配的概念转换,n个边的匹配,就是n条边没有共同的顶点,那就是2*n个点,没有共同的边
那么问题就转化成点, 1 , 2 , 3.... n / 2 条边,其实就是 2 , 4 , 6 , 8 , . . n 个点的集合,集合中的点没有共同的边

首先这是一个dp问题
阶段: 每一个加边或者减边的操作
状态: S 集合 (S 集合包含哪些点)
状态转移方程

F [ 0 ] = 1

F [ S ] = u v S { F [ S ] + F [ S u v ] F [ S ] F [ S u v ]

加边比较好理解就是加 F [ S ] 由两部分组成,一部分是之前S集合匹配的个数F[S],一部分是之前不含有(u,v) 顶点,现在加入(u,v) 顶点形成S集合 F[S-u-v]
减边的时候可以这样理解,假设上一次刚好加的就是这条边,那么使用的是+操作,这回把上一次加上的减去这样理解

参考代码

附上和标程几乎一模一样的代码

const int N = (1<<10);
int T,n,m,u,v,S;
int cnt[N];
int F[N];
int ans[15];
// 状态转移方程
// 加边的时候 F[S] = F[S]+F[S-u-v]
// 减去这条边的时候把原来加的减去 F[S] = F[S]-F[S-v-v]
int main(void)
{
   for(int i = 0;i < N; ++i) cnt[i] = __builtin_popcount(i);
   scanf("%d",&T);
   while(T--){
    scanf("%d %d",&n,&m);
    int all = 1<<n;
    for(int i = 0;i < all; ++i) F[i] = 0;
    F[0] = 1;
    while(m--){
        char c[10];
        scanf("%s %d%d",c,&u,&v);
    // cout<<c<<u<<v;
        u--,v--;
        S = (1<<u)|(1<<v);
        if(c[0] == '+'){
                for(int i = 0;i < all; ++i){
                    if(!(S&i)) F[i^S] =( F[i^S] + F[i])%mod;
                  }
           }
        else {
               for(int i = 0;i < all; ++i){
                   if(!(S&i)) F[i^S] = (F[i^S] - F[i])%mod;
               }
        }
        for(int i = 0;i <= n; ++i)
           ans[i] = 0;
        for(int i = 0;i < all; ++i)
           ans[cnt[i]] = (ans[cnt[i]]+F[i])%mod;
        for(int i = 2;i <= n; i += 2){
           printf("%d%c",(ans[i]%mod+mod)%mod," \n"[i==n]);
          }
       }

   }

   return 0;
}


全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务