首页 > 其他分享 >UOJ37 【清华集训2014】主旋律(SCC/DAG 状态压缩)

UOJ37 【清华集训2014】主旋律(SCC/DAG 状态压缩)

时间:2024-12-26 10:53:33浏览次数:7  
标签:DAG UOJ37 int SCC edge mod rightarrow

题意

求一个有向图 \(G\) 删掉一些边后原图仍强连通的方案数。模数 \(10^9+7\)。

\(n\le 15,m\le n(n-1)\)

分析

SCC 状压有一个非常经典的“耳分解”:以 SCC 内两个点(可以相同)为起点、终点,找一条除两端外不在 SCC 内的链,然后加进去。但是这里要求方案数,耳分解失效,考虑别的方法。

我们知道,DAG 计数的经典方法是枚举点集的一个非空子集 \(T\),并钦定 \(T\) 是入度为 0 的点的集合。但是实际情况中 \(T\) 不一定是所有入度为 0 的点,所以考虑容斥,有结论是:\(T\) 的容斥系数为 \((-1)^{|T|-1}\)。设 \(f_S\) 表示 \(S\) 点集形成 DAG 的方案数,有转移 \(f_S\leftarrow (-1)^{|T|-1}2^{cnt_{T\rightarrow S/T}}f_{S/T}\),\(cnt_{S\rightarrow T}\) 表示起点在 \(S\) 终点在 \(T\) 的边数。

回到原问题,设 \(f_S\) 表示 \(S\) 点集形成 SCC 的方案数。正着做有点困难,设 \(edge_S\) 表示 \(S\) 内部的边数,考虑用 \(2^{edge_S}\) 减去不为 SCC 的方案数,后者相当于求缩点后形成 DAG 且点数 \(\ge 2\) 的方案数。套用 DAG 计数的经典做法,枚举入度为 \(0\) 的子集 \(T\)(\(T\) 可以等于 \(S\),但此时 \(T\) 内部必须形成 \(\ge 2\) 个 SCC),那么 \(S/T\) 内部的以及 \(T\rightarrow S/T\) 的边任意连,\(S/T\rightarrow T\) 的边不能连,此时若 \(T\) 中 SCC 个数为 \(t\),那么容斥系数就是 \((-1)^{t-1}\),考虑设 \(g_S\) 表示 \(S\) 内形成若干个 SCC 的带容斥系数方案数,转移就是 \(g_S=-\sum_{T\subset S}g_{S-T}f_{T}\),为了避免算重,\(T\) 必须包含 \(S\) 的最低位。最终 DP 式子就是

\[f_S=2^{edge_S}-\sum_{T\subseteq}2^{edge_{S/T}+cnt_{T\rightarrow S-T}}g_{T} \]

最后别忘了把 \(g_S=g_S+f_S\)。

const int maxn=16,maxm=1<<15,maxk=14348907,mod=1e9+7;
int n,m;
bool vis[maxn][maxn];
int e[maxn][maxm];
int edge[maxm];
int pw[maxn*maxn];
int f[maxm],g[maxm],h[maxk];
int to[maxm];
inline bool in(int S,int x){return (S>>(x-1))&1;}
inline void adder(int &x,int y){x+=y,x=x>=mod?x-mod:x;}
inline void suber(int &x,int y){x-=y,x=x<0?x+mod:x;}
inline void solve_the_problem(){
	n=rd(),m=rd();
	rep(i,1,m){
		int x=rd(),y=rd();
		vis[x][y]=1;
	}
	pw[0]=1;rep(i,1,m)pw[i]=pw[i-1]*2%mod;
	const int U=(1<<n)-1;
	rep(S,0,U)rep(i,1,n)if(in(S,i))rep(j,1,n)if(in(S,j))edge[S]+=vis[i][j];
	rep(i,1,n)rep(S,0,U)rep(j,1,n)if(in(S,j))e[i][S]+=vis[i][j];
	rep(S,0,U)rep(i,1,n)to[S]=to[S]*3+in(S,i);
	rep(S,1,U){
		int p=__builtin_ctz(S),S0=S^(1<<p),S1=U^S;
		for(int T=S1;T;T=(T-1)&S1){
			h[to[S|T]+to[S]]=h[to[S0|T]+to[S0]]+e[p+1][T];
		}
	}
	rep(S,0,U)f[S]=pw[edge[S]];
	rep(S,1,U){
		int p=__builtin_ctz(S);
		for(int T=(S-1)&S;T;T=(T-1)&S)if((T>>p)&1){
			suber(g[S],g[S^T]*f[T]%mod);
		}
		for(int T=S;T;T=(T-1)&S){
			suber(f[S],pw[edge[S^T]+h[to[S]+to[T]]]*g[T]%mod);
		}
		adder(g[S],f[S]);
	}
	write(f[U]);
}

复杂度 \(O(3^n+2^nn^2)\)。

标签:DAG,UOJ37,int,SCC,edge,mod,rightarrow
From: https://www.cnblogs.com/dcytrl/p/18632237

相关文章

  • dagger.js:AI都知道了,你还不知道?
    内容同步发表于微信公众号:我是王多余天工天工告诉我,世界上最简单好用的前端框架是什么呀?大家好,我是非主流前端开发框架dagger.js的作者王多余。从本篇开始我会写一组系列文章,来聊聊dagger.js究竟是什么,该如何使用。 正文开始前先回(吐)顾(槽)一下行业发展史。从开箱即用到......
  • 深度学习基础理论————学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)
    学习率基础[1]学习率(LearningRate)在优化算法,尤其是梯度下降和其变体中,扮演着至关重要的角色。它影响着模型训练的速度和稳定性,并且是实现模型优化的关键参数之一。如何理解呢?在统计学中,线性方程的优化过程通常包括以下步骤:构建方程:定义一个模型,例如线性方程(y=wx+b)......
  • dagger.js: 来看几个小栗子
    大家好,我是Tony。今天给大家分享一些使用dagger.js开发的样例作品。这些demo大多是fork(白嫖)自开源的react/vue版本后改写的,在此感谢各位原作者的工作。对比两个版本的源码可以直观地感受dagger语法与其他框架之间的差异。在之后的文章里,我们会结合实例来进一步详细介绍dagger......
  • dagger.js:可能是我见过的最简单易用的前端框架了
    向大家推荐一款轻量完备且简单易用的开源前端框架dagger.js。01.什么是dagger.jsdagger.js是一个基于html的描述式单页应用开发框架,通过在页面DOM元素上添加语义化的指令来驱动业务逻辑。从语法特性的角度来说,dagger.js模板+指令的工作方式与Angular/Vue比较接近。dagger.js......
  • dagger.js:你要控制你自己(控制指令)
    前情提要:dagger.js:近水楼台先得月(作用域嵌套)大家好,我是Tony。上一篇咱们讲过了如何使用生命周期指令+load创建作用域,以及通过事件处理指令+click绑定用户事件,这一篇来说说dagger.js的最后一种指令类型:控制指令。控制指令通常用于将作用域数据映射为DOM元素的attribute,根据......
  • Dolphinscheduler DAG核心源码剖析
    背景描述注意:在Dolphinscheduler中,离线任务是有完整的声明周期的,比如说停止、暂停、暂停恢复、重跑等等,都是以DAG(有向无环图的形式进行任务组织)T+1离线任务的。DolphinschedulerDAG实现org.apache.dolphinscheduler.common.graph.DAGDAG三个重要的数据结构://顶点......
  • ISSCC2025 Computing-In-Memory Session 趋势整理
    今天下午ISSCC2025发布会开完,CIMSession花落谁家终于清楚了。今年CIM被放到了Session14,共录取七篇,投稿数如果和去年差不多的话,那么录取率应该是进一步下降了(去年录取了九篇)。只能说体感上来说就明显越来越卷。还是先来看一下录取的Paper:7篇都来自远东,两篇台湾,五篇大陆,东南......
  • 有向无环图(DAG,Directed Acyclic Graph)算法
    大家好!今天我想给大家讲一个非常有趣的算法,叫做有向无环图(DAG,DirectedAcyclicGraph)算法。这个算法就像是在玩一个游戏,帮我们找到完成一系列任务的最佳顺序!什么是有向无环图?假设你喜欢做一些手工DIY,比如制作一个纸飞机。但你发现,做纸飞机需要先完成一些步骤,比如剪纸、折纸、......
  • DAG(有向无环图)通俗介绍
    什么是DAG(有向无环图)?DAG全称为“DirectedAcyclicGraph”,中文意思是“有向无环图”。顾名思义,这是一种特殊的图结构,其中包含了“有向”的边和“无环”的特性。什么是图?在计算机科学和数学中,“图”是一种数据结构,用来表示事物之间的关系。图由两部分组成:节点(Vertices):图中的一个个独......
  • Spring Boot利用dag加速Spring beans初始化
    1.什么是Dag?有向无环图(DirectedAcyclicGraph),简称DAG,是一种有向图,其中没有从节点出发经过若干条边后再回到该节点的路径。换句话说,DAG中不存在环路。这种数据结构常用于表示并解决具有依赖关系的问题。DAG的特性首先,DAG中的节点可以有入度和出度。节点的入度是指指向该......