UOJ#37.【清华集训2014】主旋律 状压DP

【BZOJ3812】【UOJ37】【清华集训2014】主旋律 【题目链接】BZOJUOJ【思路要点】我们希望求出使得图强联通的边集数,这等价于求出所有边集数减去使得图不强连通的边集数。首先考虑一种非常暴力的做法,我们枚举最终的图缩点后的情况。那么,剩下的图必须是一个DAG,我们希望求出这张图在是DAG的情况下可行的边集数,并与每一个强连通分量加边方案数相乘,得到答案。后面的这个问题是原问题的一个子问题,递归对对应强联通分量的导出子图求解即可。问题在于求解一张... 阅读详情

时空隧道


昨天考试第二题与此题相似….(话说这还是NOIP模拟赛???),所以才找了此题….一开始没意识到是集训…等我发现的时候…2333….还是看了题解…..


分析:
其实此题简化一下就是说有多少个生成子图是强连通的….
(所谓生成子图就是只能去边不能去点的子图)一看数据范围,妥妥的状压DP…
f[i]代表i点集的强连通生成子图数量…
由于求强连通生成子图略麻烦(略??…)所以我们转化为求非强连通的生成子图的数量….
我们如果把一个非强连通的有向图缩一缩点…一定存在一些入度为0的点…所以我们只要枚举这些点就好(以为可能会有重复的…那就通过容斥原理来解决)
M[i]解释起来略麻烦…
假设i={1,2,3}…
M[i]=cnt[{1},{2},{3}]-cnt[{1,2},{3}]-cnt[{1},{2,3}]-cnt[{1,3},{2}]+cnt[{1,2,3}](+-就是容斥原理)
cnt[{1},{2},{3}]代表的是123分别是缩完点之后入度为0的点…那么cnt[{1},{2},{3}]就代表当前状态的子图的数量…
G[i]代表的是i的边集的数量….
然后计算的时候我们只需要计算这些入度为0的点向其他点的连边….


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
const int MOD=1000000007;
int n,m,in[1<<15],out[1<<15],num[1<<15],cnt[1<<15];//num[i]代表i集合有几个点,cnt[i]代表入度为0的强连通分量到剩下的节点的边数 
long long f[1<<15],M[1<<15],G[1<<15];//f[i]代表i的生成子图是强连通的方案数,M[i]枚举的是i缩点之后的DAG中的入度为0的强连通分量,G[i]代表的是i的边集的数量 
long long power[15*15];
signed main(void){
    scanf("%d%d",&n,&m);power[0]=1;
    for(int i=1;i<=n*n;i++)
        power[i]=power[i-1]*2%MOD;
    for(int i=1;i<1<<n;i++)
        num[i]=num[i-(i&-i)]+1;
    for(int i=1,x,y;i<=m;i++)
        scanf("%d%d",&x,&y),out[1<<x-1]|=1<<y-1,in[1<<y-1]|=1<<x-1;
    f[0]=1,M[0]=MOD-1,G[0]=1;
    for(int i=1;i<1<<n;i++){
        if(num[i]==1){
            f[i]=M[i]=G[i]=1;
            continue;
        }
        int x=i&-i,v=i-x,edgenum=0;
        for(int j=0;j<n;j++)
            if(i&(1<<j))
                edgenum+=num[out[1<<j]&i];
//cout<<edgenum<<endl;
        G[i]=f[i]=power[edgenum],M[i]=0;//f[i]=所有的子图-不合法的子图 
        for(int j=v;;j=(j-1)&v){
            int now=j|x;
            if(now!=i)
                M[i]=(M[i]-f[now]*M[i-now]%MOD+MOD)%MOD;//容斥原理,f[now]本身就是一个强连通图,M[i-now]就是一个子问题,因为多了now这个强连通分量奇偶性改变所以- 
            if(j==0)
                break;
        }   
        int sum=0;//不合法的
        for(int j=i;j;j=(j-1)&i){
            if(j==i)
                cnt[j]=0; 
            else{
                int lala=(i-j)&(-(i-j)),lalala=j|lala;
                cnt[j]=cnt[lalala]-num[out[lala]&(i-lalala)]+num[in[lala]&j];
            }
            sum=(sum+M[j]*G[i-j]%MOD*power[cnt[j]]%MOD)%MOD;
        }
        f[i]=(f[i]-sum+MOD)%MOD,M[i]=(M[i]+f[i])%MOD;
    }
    cout<<f[(1<<n)-1]<<endl;
    return 0;
}

by >_< NeighThorn

【UOJ#37】 [清华集训2014] 主旋律 题目链接 题目描述 给定一张强联通图,求有多少种边的存在情况满足图依然强联通。 n≤15n\leq15n≤15 Sol 首先正难则反,考虑用总数减去不强联通的。 考虑一张不强联通的图,缩点后一定是一个 DAG,好像可以对 DAG 进行计数。 诈一看这个做不了,因为缩点后计数是不可能在dp过程中实现的。 但我们按照 DAG 计数的思路的话其实并不需要真的知道 DAG 缩点后的形态。 我们类似 DAG... 阅读详情

相关推荐

【清华集训2014】【BZOJ3812】主旋律

Description响应主旋律的号召,大家决定让这个班级充满爱,现在班级里面有 n 个男生。 如果 a 爱着 b,那么就相当于 a 和 b 之间有一条 a→b 的有向边。如果这 n 个点的图是强联通的,那么就认为这个班级是充满爱的。 不幸的是,有一些不好的事情发生了,现在每一条边都可能被摧毁。我作为爱的使者,想知道有多少种摧毁的方式,使得这个班级任然充满爱呢?(说人话就是有多少边的子集删去之后

CreationAugust is 14 years old forever 2678

【bzoj3812】【清华集训2014】主旋律(容斥,计数)

毒 瘤 计 数! XSY 题意不是很清楚,这里给出更加清楚的: 给定一张 nnn 个点 mmm 条边的无向图,保证该图整个图为一个强联通分量,且无重边自环。现在需要求出:有多少种删边方案,使得删完边后,整个图依旧是一个强联通分量。数据范围:n≤15,m≤n(n−1)n\leq 15,m\leq n(n-1)n≤15,m≤n(n−1)。 记 E[U,V]E[U,V]E[U,V] 表示题目给的所有边中,起点在 UUU 中、终点在 VVV 中的所有边的集合,其中 U,VU,VU,V 为点集。 对于一个点集 SSS

ez_lcw的博客 377

onnxruntime-gpu版本选择与CUDA环境配置实战指南

本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。

weixin_29164091的博客 522

[清华集训2014]主旋律

完全不会做啊,dp 套 dp 真的好难,哭了。

七代目鸽影 516

外设高级定时器互补输出带死区控制实验

外设高级定时器互补输出带死区控制实验

ff_juju的博客 1652

Jetson编译安装pycuda

可使用nvcc --version查看是否有信息输出,若没有,且安装cuda的情况下,需要手动将CUDA 的路径添加到环境变量中。编译生成_pvt_struct.cpython-38-aarch64-linux-gnu.so文件。基于jetson orin nano jetpack512模块上安装pycuda。4、获取pycuda源码(版本根据实际情况获取)2、进入conda环境并安装cuda工具包。9、若未检测出来需要清除并强制编译。7、编译成功后安装pycuda。5、配置编译并设置环境变量。

qq_48175141的博客 970

uoj#37. 【清华集训2014】主旋律(状压dp+容斥)

传送门 第一眼容斥,然后我就死活容不出来了…… 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓扑序最小(也就是入度为\(0\))的强连通分量,然而这种强联通分量可能不止一个,需要容斥,不难发现这里的容斥系数在强联通分量个数为奇数时为正,为偶数时为负(也就是强联通分量为奇数时要减掉方案数,为偶数...

weixin_34248023的博客 254

如何在Ubuntu 22.04上为AlphaFold3配置NVIDIA A100 GPU(含驱动安装避坑指南)

本文提供了在Ubuntu 22.04系统上为AlphaFold3部署NVIDIA A100 GPU的完整安装教程。内容涵盖从系统环境准备、NVIDIA驱动安装与避坑指南,到Docker容器化部署、数据库获取以及最终构建运行AlphaFold3的详细步骤,旨在帮助研究者和开发者高效配置高性能计算环境,充分发挥A100的硬件潜力。

nft7creator的博客 468

「清华集训2014」主旋律

「清华集训2014」主旋律 这个题好难难啊,我想了一个小时连50分都不会,只能去摸周指导了。 解题思路 我们试图直接爆算集合 \(S\) 的非强连通导出子图数量,考虑将这个导出子图的所有强连通分量缩点后,一定是一个点数 \(\geq 2\) 的 \(\text{DAG}\) 。即缩完以后至少要有一个入度为 \(0\) 的点,这个条件充分性显然,必要性考虑如果不存在入度为 \(0\) 的点...

weixin_30379911的博客 906

神州路由器DHCPv6配置

神州路由器DHCPv6配置.。

weixin_41687096的博客 460

3分钟学会SQL中的断点去重技术,轻松搞定连续重复数据去重问题?

传感器采集的温度数据中,存在连续重复的值,需仅在数值变化时保留记录(例如:温度从 25°C 变为 26°C 时记录一次)。:判断逻辑,current_value!若当前温度与前一行的温度不同(或为第一条记录),则保留该行。的技术,常用于时间序列或状态日志中。:将连续相同值的记录合并,只保留断点处的记录。保留断点处的记录(即温度变化时的第一条)。原始数据表 sensor_data。最终仅保留值变化的断点记录。获取前一行的温度值。

石榴姐yyds 1019

[BZOJ3812][UOJ#37][清华集训2014]主旋律(状压 DP + 容斥原理)

Address BZOJ 3812 UOJ #37 Solution 考虑状压 DP ,定义状态 f[S]f[S]f[S] 表示原图的点集 SSS 的导出子图中,有多少个边子集能强连通点集 SSS g[S]g[S]g[S] 表示将原图的点集 SSS 分割成一些非空子集,每个点子集分别用其内部的边将其强连通的方案数,分成的子集个数为奇数时计入 g[S]g[S]g[S] ,子集个数为偶数时从 g...

女装的你,如此好看! 423

基于深度学习的活体人脸检测系统:YOLOv5、YOLOv6、YOLOv7、YOLOv8实现与UI界面设计

本博客详细介绍了如何基于YOLOv5、YOLOv6、YOLOv7、YOLOv8模型实现一个完整的活体人脸检测系统。系统包括数据集准备、模型训练、UI界面设计以及实时检测功能的实现。通过YOLO系列模型的应用,我们能够高效、准确地进行人脸检测和活体验证。未来,随着YOLOv9和其他新一代目标检测模型的出现,我们可以进一步提高检测精度和速度。此外,集成更多的传感器数据(如深度传感器、红外线传感器)可以使活体检测系统更加安全和稳定。

YOLO 540

【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果。 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum[i]}$ 减去不为强连通图的方案数得到强连通图的方案数,其中 $sum[i]$ 表示点集 $i$ 中边的数目。 考虑什么样的图不是强连通图:缩点后入度为0的强连通分量对应的点...

weixin_30901729的博客 191

APM32取代STM32的经验分享

我仔细检查了代码中与硬件相关的部分,例如外设寄存器的访问和中断处理程序的设置,并进行了相应的修改。在本文中,我将分享我将APM32引入项目中取代STM32的经验,并提供相应的源代码。我查看了APM32的官方网站、开发者论坛和相关社交媒体,了解了开发者社区的活跃度和可用的资源。总结起来,将APM32替换STM32的过程需要经过几个关键步骤:了解APM32的规格和功能、评估软件生态系统、迁移代码和调试,以及性能和功耗优化。在开始替换之前,我对APM32进行了详细的研究和评估,以确保它能够满足项目的需求。

UplKubernetes的博客 2004

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【清华集训2014】主旋律

【清华集训2014】主旋律 题目大意 给定一张\(n\)个点\(m\)条边的无向图,保证该图整个图为一个强联通分量,保证无重边自环。 现在需要求出:有多少种删边方案,使得删完边后,整个图依旧是一个强联通分量。 数据范围:\(n\leq 15 , m\leq n(n-1)\) 。 题解 容斥题是真的鸡贼......,这\(TMD\)是人能想出来的? 希望下次自己再来看这篇题解的时候还能看懂...

df4516的博客 442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

UOJ#37. 【清华集训2014】主旋律

题目大意:   传送门 题解:   神题……Orz。   首先正难则反。   设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数。   设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保证$i<|S|$。   设$e[S,T]$表示从S集合到T集合的边数。   很显然有。   好吧,并不显然……还是来解释一下……   考虑求$f_S$,我...

weixin_30415113的博客 187

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

uoj37 主旋律

题意:一个班级n个人,如果a爱b,那么a->b一条有向边。问有多少种删边集合使得图仍然强联通? n<=15. 标程: 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<bitset> 5 using ...

b121382291的博客 233

UOJ #390 【UNR #3】百鸽笼 容斥+DP

题目分析 算法0 每个管理员选哪一列,将构成一个长度为N−1N-1N−1的序列,序列的种数可以通过经典的将aaa个相同元素插入到一个没有该元素的长度为bbb的序列里问题,轻松求出。若一列iii要求有空笼,则标号iii只出现ai−1a_i-1ai​−1次,然后算出每种序列的种数,按种数分配概率。 期望得分:0 算法1 分析一下算法0错在哪——每种序列的出现概率并不是相等的,因为每一个管理员选择列的时...

litble的成(tui)长(fei)史 692

UOJ#37 主旋律 题解

UOJ#37 主旋律 题解

zrl000308的博客 875

【BZOJ3812】【UOJ37】【清华集训2014】主旋律(状压DP)

Description 给定有向图,询问有多少种删边的方案满足剩余部分强联通。 Solution 设f[S]f[S]f[S]表示有多少个边集使点集S构成了一个强连通分量 g[S]g[S]g[S]表示有多少个边集使点集S划分成互相之间没有边偶数个强连通分量 h[S]h[S]h[S]表示有多少个边集使点集S划分成互相之间没有边奇数个强连通分量 那么有转移: g[S...

დ♂Hany01's Blog Space♂ღ 458

UOJ37. 【清华集训2014】主旋律

http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通。 先补集转化一下,求这张图不强连通的方案数。 我们考虑这样的图缩完点之后的情况,既然不强连通,那么它就是个\(DAG\)。 回顾一下有向图\(DAG\)计数的方法。 每次新加入一层入度为\(0\)的点,向之前的点连边。但这时我们不能保证我们枚举的点就是全部入度为\(0\)的,所以我们还...

weixin_30919919的博客 256
上一篇: POJ 3233 Matrix Power Series 矩阵快速幂
下一篇: POJ 2054 Color a Tree 贪心
NeighThorn
博客等级 码龄11年 20粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值