当前位置: 首页 > news >正文

BZOJ 3812 : 主旋律

非常神仙的状压DP+容斥原理。

首先,给出一个状压方程:$f_S$表示点集为$S$的情况下,整个点集构成强连通图的方案数。

这个DP方程还是比较容易想到的,但是没有办法正常转移,考虑通过容斥原理进行转移。

对于一个点集,它无法构成强连通分量的方案,就是我们选择一个出度为$0$的强连通分量,这个强连通分量并不包含整体的方案,就是无法构成的方案数,也就是缩点后的图是一个至少两个节点的DAG。

那么,我们可以钦定一个点集$j,j\subset S$作为出度为$0$的强连通分量,那么可以得到,这样其他的不是从这个点集连向其他点集的边是随意选取的,也就是$2^p$种方案。

但是由于我们不知道$S-j$的部分中有没有出现出度为$0$的强连通分量,如果出现,那么就重复计算了。

所以考虑容斥,$t_i$表示$i$点集构成点数大于1的DAG的方案数,$t_S=\sum\limits_{j\subseteq S,j\ne 0}{(-1)^{|j|-1}\times 2^{way_{i-j,j}}}\times t_{i-j}$,其中$way_{j,i-j}$表示$i-j$点集向$j$点集链接的边,$|j|$表示选择的强连通分量集的强连通分量数量。

上面的式子应该会很好理解,就不多解释了,那么根据上面的式子,我们提出一个建设性的想法,$g_i$表示$i$的点集中,构成奇数个互不连通强连通分量-构成偶数个互不连通强连通分量的方案数,也就是说在状态中直接包含容斥系数,那么可以给出方程:$g_S=f_S-\sum\limits_{j\subseteq S,u\in j}g_{S-j}\times f_j$

这个式子的正确性关键在于$g_S$构成的强连通分量是互不连通(因为出度全部为$0$)的,所以这样转移显然是正确的。

那么接下来考虑$f_S$如何更新。

同样,我们回到上面的式子,$t_S$可以表达为:$t_S=\sum\limits_{j\subset i,j\ne 0}g_j\times 2^{sum_S-w_j}$,$w_j$表示$j$连向$S$的边数。

然后,$f_S=2^{sum_S}-t_S$

然后我们就解决这道题啦!撒花撒花✿✿ヽ(°▽°)ノ✿

建议搭配下面文档食用

https://files-cdn.cnblogs.com/files/Winniechen/BZOJ3812.pdf

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <iostream>
#include <bitset>
using namespace std;
#define N (1<<15)+20
#define ll long long
#define mod 1000000007
int f[N],g[N],cnt[N],in[N],out[N],n,m,b[N],w[N],sum[N];
void dfs(int i,int j)
{
    if(i&(j-1))dfs(i,i&(j-1));
    w[j]=w[j-(j&-j)]+cnt[in[j&-j]&i];
}
int main()
{
    scanf("%d%d",&n,&m);b[0]=1;
    for(int i=1,x,y;i<=m;i++)
    {
        scanf("%d%d",&x,&y);x--,y--;
        in[1<<x]|=1<<y,out[1<<y]|=1<<x;
        b[i]=(b[i-1]<<1)%mod;
    }
    for(int S=1;S<1<<n;S++)
    {
        int x=S&-S,s=S^x;cnt[S]=cnt[s]+1;sum[S]=sum[s]+cnt[in[x]&S]+cnt[out[x]&S];
        dfs(S,S);f[S]=b[sum[S]];
        for(int j=s;j;j=s&(j-1))g[S]=(g[S]-(ll)f[S^j]*g[j])%mod;
        for(int j=S;j;j=S&(j-1))f[S]=(f[S]-(ll)g[j]*b[sum[S]-w[j]])%mod;
        g[S]=(g[S]+f[S])%mod;
    }
    printf("%d\n",(f[(1<<n)-1]+mod)%mod);
}

  

转载于:https://www.cnblogs.com/Winniechen/p/9862735.html

相关文章:

  • 《JavaScript实用效果整理》系列分享专栏
  • 浅谈web中前端模板引擎的使用
  • pytorch实战(2)-----回归例子
  • 柔宇科技发售可折叠柔性屏手机 平板与手机从此二合一
  • 浅析宽带接入技术
  • 一个网工的Linux学习过程
  • 数据结构(算法)-图(最短距离Dijkstra)
  • Jessica Kerr:高绩效团队简史
  • Windows操作系统查看电脑开关机记录
  • 实现图元及属性的算法---椭圆生成算法
  • 大快搜索数据爬虫技术实例安装教学篇
  • 解决项目不编译4大clean
  • 迭代器 /生成器 yield
  • mysql表与表之间的关系
  • 对标汽车之家,新势力杉车网的另类崛起
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Brief introduction of how to 'Call, Apply and Bind'
  • CentOS7简单部署NFS
  • create-react-app做的留言板
  • Fastjson的基本使用方法大全
  • Java的Interrupt与线程中断
  • java概述
  • JS笔记四:作用域、变量(函数)提升
  • Making An Indicator With Pure CSS
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 给第三方使用接口的 URL 签名实现
  • 思否第一天
  • 通过npm或yarn自动生成vue组件
  • 我这样减少了26.5M Java内存!
  • 用简单代码看卷积组块发展
  • # 飞书APP集成平台-数字化落地
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (九)c52学习之旅-定时器
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十六)Flask之蓝图
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .cfg\.dat\.mak(持续补充)
  • .NET 解决重复提交问题
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET企业级应用架构设计系列之结尾篇
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ Linux ] Linux信号概述 信号的产生
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ABC294Ex] K-Coloring