【清华集训2014】主旋律 题解

神秘题。

题目简述

  • 给你一个有向图 \(G=(V,E)\)。求有多少 \(E\) 的子集 \(E'\) 使得新图 \(G'=(V,E')\) 是强连通图。

  • 强连通图的定义是任意两点 \(u,v\) 均存在 \(u\to v,v\to u\) 的路径。

  • \(n\leq 15,m\leq n\times(n-1)\)。

解题思路

下面记点集 \(V_1\) 导出子图的答案为 \(f(V_1)\)。我们只要求 \(f(V)\)。我们考虑对每个点集 \(V_1\subset V\) 都求出 \(f(V_1)\)。

正难则反,我们考虑他不是强连通图的方案。非强联通图缩点以后是一个 DAG,我们考虑枚举 DAG 当中所有入度为 \(0\) 的点,然后容斥即可。

更具体的,我们需要枚举所有入度为 \(0\) 的强连通分量 \(V'\subset V\),定义 \(g(V')\) 为选取的方案数,那么剩下的任务就是在 \(e^{\dagger}[V'\to V/V']\) 和 \(e[V/V'\to V/V']\)。这些边是可以任意选取的。我们不需要担心重复的问题,这应该在 \(g\) 当中就解决掉。

\(^{\dagger}\) \(e[U\to V]\) 表示起点在点集 \(U\) 终点在点集 \(V\) 的有向边数量。

总结一下上面也就是:

\[f(V)=2^{e[V\to V]}-\sum_{V_1\subset V} g(V_1)\times 2^{e[V\to V/V']}
\]

我们再考虑 \(g(V)\) 的计算方法。\(g(V)\) 的另一种理解是缩点后两两不联通的方案再去乘上容斥系数(偶数个连通分支为 \(-1\),奇数个为 \(1\)),我们去枚举一个连通分支就可以了。也就是:

\[g(V)=\sum_{V_1\subset V,u\in V_1} -f(V_1)\times g(V-V_1)
\]

其中 \(u\) 是随意选取的一个 \(V\) 中的点。要注意的是 \(V_1\) 可能等于 \(V\),所以要先计算 \(f(V)\)。

至此这题便做完了。时间复杂度 \(O(3^n\times n)\)。

参考代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MOD=1e9+7;
int n,m;
int a[20];
ll pw[205],f[1<<16],g[1<<16];
int popcount(int x){int cnt=0;while(x)cnt++,x-=(x&-x);return cnt;}
int edge(int u,int v){
int cnt=0;
for(int i=0;i<n;i++)if(u>>i&1)cnt+=popcount(a[i]&v);
return cnt;
}
void del(ll &x,ll y){x-=y;if(x<0)x+=MOD;}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
a[u-1]|=(1<<v-1);
}
pw[0]=1;
for(int i=1;i<205;i++) pw[i]=pw[i-1]*2%MOD;
for(int i=1;i<(1<<n);i++){
int t=(i&-i),k=i^t;// 固定一个点
for(int j=(k-1)&k;j;j=(j-1)&k) del(g[i],g[k^j]*f[j|t]%MOD);
if(t!=i) del(g[i],g[k]);
f[i]=pw[edge(i,i)];
for(int j=i;j;j=(j-1)&i) del(f[i],g[j]*pw[edge(i,i^j)]%MOD);
g[i]+=f[i];g[i]%=MOD;
}
cout<<f[(1<<n)-1];
return 0;
}

【容斥、状压dp】主旋律 题解的更多相关文章

  1. bzoj2669[cqoi2012]局部极小值 容斥+状压dp

    2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 774  Solved: 411[Submit][Status ...

  2. bzoj3812 主旋律 容斥+状压 DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...

  3. ARC 093 F Dark Horse 容斥 状压dp 组合计数

    LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...

  4. [BZOJ2669][CQOI2012]局部最小值(容斥+状压DP)

    发现最多有8个限制位置,可以以此为基础DP和容斥. $f_{i,j}=f_{i-1,j}\times (cnt_j-i+1)+\sum_{k\subset j} f_{i-1,k}$ $cnt_j$表 ...

  5. POJ - 3254 Corn Fields(状压DP)题解

    思路: 参照blog,用状压DP做,和题解稍微有点不一样,我这里直接储存了状态而不是索引. 这一题的问题是怎么判断相邻不能种,我们用2进制来表示每一行的种植情况.我们将每一行所能够造的所有可能都打表( ...

  6. FJNU Fang G and his Friends(状压DP)题解

    Description     众所周知,fang G 有很多小伙伴,有一天,Fang G 打算带他们去玩有趣的游戏OOXX,这个游戏需要分成两组,有趣的是,每个人互相之间都有一个满意度,大家都想和自 ...

  7. [状压DP]P1441 题解 砝码称重

    前置知识:状压DP 洛谷传送门 emm....看到题目,我第一个想到的就是枚举.暴力大法好! 具体怎么枚举?当然是子集枚举啦!枚举出每一个可能的砝码选择方案.对于每一个合法的(也就是选取数量等于\(n ...

  8. POJ 2923 Relocation(状压DP)题解

    题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...

  9. HDU 4272 LianLianKan(状压DP)题解

    题意:一个栈,每次可以选择和栈顶一样的数字,并且和栈顶距离小于6,然后同时消去他们,问能不能把所有的数消去 思路:一个数字最远能消去和他相距9的数,因为中间4个可以被他上面的消去.因为还要判断栈顶有没 ...

  10. HDU 4628 Pieces(状压DP)题解

    题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...

随机推荐

  1. C/C++ 实现简易HTTP服务器

    #include <stdio.h> #include <stdlib.h> #include <process.h> #include <WinSock2. ...

  2. 从嘉手札<2023-12-15>

    荒原  朔方 2023.12.15 人生实属是很愁的时间 愁到听不见一点雪花飘落的声音 愁到连随便写点文章都算得上拼尽全力 萧瑟的北风吹散了为数不多的倔强 漫天的雪花飞舞 埋葬的是那么多年走过的春秋 ...

  3. 使用Miniconda安装R语言环境

    使用Miniconda安装R语言 下载Miniconda3-latest-Linux-x86_64.sh 静默安装 sh Miniconda3-latest-Linux-x86_64.sh -b -p ...

  4. centos离线安装chrony

    环境 CentOS Linux release 7.9.2009 (Core) 工具 chrony-2.2.1.tar.gz 下载地址:https://download.tuxfamily.org/c ...

  5. Windows开机自动同步时间

    前言   有些Windows客户端因主板电池没电或其他原因,每次启动系统后,读取到BIOS的时间是初始时间(1970年)或错误的时间,这时需要系统启动后立即向时间服务器同步一次时间.   该方法是添加 ...

  6. 英特尔发布酷睿Ultra移动处理器:Intel 4制程工艺、AI性能飙升

    英特尔今日发布了第一代酷睿Ultra移动处理器,是首款基于Intel 4制程工艺打造的处理器. 据了解,英特尔酷睿Ultra采用了英特尔首个用于客户端的片上AI加速器"神经网络处理单元(NP ...

  7. U390630 分考场题解

    题目链接:U390630 分考场 本题来自于2019年蓝桥杯国赛的题.在洛谷上也被标为了假题.原因是首先官方在需要输出浮点数的情况下,并没有开启spj,并且官方所给的数据当中,总有一两个数据以不知道到 ...

  8. 教你用Java实现动态调色板

    案例介绍 欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用Java编程实战案例,做一个动态调色板.案例界面会出现三个滑动组块以及对应的数值,通过移动滑块可以改变颜色区域的显示.通过实 ...

  9. 【调试】pstore原理和使用方法总结

    什么是pstore pstore最初是用于系统发生oops或panic时,自动保存内核log buffer中的日志.不过在当前内核版本中,其已经支持了更多的功能,如保存console日志.ftrace ...

  10. 思维分析逻辑 5 DAY

    目录 如何分析 结构分析 对比分析 时间序列 相关性分析 机器学习 报告撰写 报告撰写三原则 标准化报告的组成 AB测试 AB测试流程 AB测试注意事项 如何分析 结构分析 对比分析 对比分析:所有的 ...