题意:一个班级n个人,如果a爱b,那么a->b一条有向边。问有多少种删边集合使得图仍然强联通? n<=15.
 

标程:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n,m,Max,pop[N],pow[N],sum_e[N],to_e[N],f[N],a,b,e[N],ie[N],u[N];
int lowbit(int x){return x&(-x);}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++)
{
a=read(),b=read();
e[<<a-]|=<<b-,ie[<<b-]|=<<a-;
}
Max=<<n;pow[]=;
for (int i=;i<Max;i++) pop[i]=pop[i>>]+(i&),pow[i]=(ll)pow[i-]*%mod;
for (int i=;i<Max;i++)
{
int v=lowbit(i);int p=i^v;
sum_e[i]=sum_e[i^v]+pop[e[v]&i]+pop[ie[v]&i];
f[i]=pow[sum_e[i]];to_e[i]=;
for (int j=p;j;j=(j-)&p)
u[i]=((ll)u[i]-(ll)f[i^j]*u[j]%mod+mod)%mod;
for (int j=i;j;j=(j-)&i)
{
int v=lowbit(i^j);to_e[j]=to_e[j|v]-pop[e[v]&(i^j)]+pop[ie[v]&j];
f[i]=((ll)f[i]-(ll)pow[sum_e[i^j]+to_e[j]]*u[j]%mod+mod)%mod;
}
u[i]=((ll)u[i]+f[i])%mod;
}
printf("%d\n",f[Max-]);
return ;
}

技巧:用lowbit(i)取出i中的任意一个元素(注意是移位<<后的)。

题解:状压枚举子集+容斥dp

乍一看只知道状压。。。强联通是什么鬼嘛。。。

考虑一个不强联通的图,至少有一个点的入度为0。

这样就可以容斥啦:全集-不强连通的图数=强联通的图数。

枚举缩点后入度为0的块有多少个,设包含入度为0的块的集合为T。f[S]表示S集合中的点构成强联通图的方案数,g[S][k]表示将S集合分成k个独立块的方案数,u[S][k]表示带容斥系数的g之和。e(S)表示S点集中的边数。e(S,T)表示从S中的点连出向T的边数。

u[S]也可以通过容斥求得。为了不算重,取一个S集中的点v作为连通块部分的必选点。(减号就相当于是连通块个数+1,(-1)^k变号)

求u和f的时间复杂度都是O(n^3)。求e(S)和e(S,T)都可以通过在子集上累加的方法计算。

最新文章

  1. Windows中使用TortoiseGit提交项目到GitLab配置
  2. ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象
  3. iOS页面间传值的方式(NSUserDefault/Delegate/NSNotification/Block/单例)
  4. Python学习 之 走进python
  5. Gerrit 删除项目
  6. 修改SELinux设置,使vsftp在enforcing security enhance模式下正常运行
  7. JAVA日期处理(Timestamp)
  8. CSS Gradient详解
  9. 网页中flash背景透明
  10. Android SDK 和 Eclipse ADT 离线安装 教程
  11. 《JAVASCRIPT高级程序设计》第五章(1)
  12. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
  13. linux CentOS
  14. Skynet服务热点火焰图分析
  15. oracle表的基本操作
  16. RabbitMQ学习系列
  17. java Map按Key排序
  18. BAT文件语法和技巧
  19. memory-based 协同过滤(CF)方法
  20. android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结

热门文章

  1. easyUI tabs 显示与隐藏 tab 页
  2. Java-Class-C:java.util.HashMap
  3. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList
  4. topjui.core.js
  5. AtCoder ABC 132E Hopscotch Addict
  6. linux centos 装g++安装不了
  7. arm-linux-readelf 的使用
  8. 能轻松背板子的FWT(快速沃尔什变换)
  9. 校园商铺-4店铺注册功能模块-6店铺注册之Controller层的实现
  10. CSS——用户界面样式