P10698 [SNCPC2024] 最大流

news/2025/1/8 11:51:08/文章来源:https://www.cnblogs.com/liyixin0514/p/18651030

P10698 [SNCPC2024] 最大流

题意

给一个 \(n\) 个点 \(m\) 条边的 DAG,起点为 \(1\),终点不定,容量全为 \(1\)。再给定一个常数 \(k\)。设从 \(1\)\(i\) 的最大流是 \(f_i\),对所有的 \(i\in[2,n]\) 求出 \(\min(f_i,k)\)

\(n\le 10^5,m\le 2\times 10^5,k\le \min(50,n-1)\)

思路

只有一个终点就可以直接跑网络流。

最大流就是问最多有多少路径满足起点在 \(S\),终点在 \(T\),没有交边。

将边转化成点,称之为假点,原来的点叫做真点。

问题变成给你一个起点的假点集合 \(A\),即真点起点的出边集合,和一个终点的假点集合 \(B\),即真点终点的入边集合。问最多的没有交点的路径条数,和 \(k\)\(\min\)


容易想到 LGV 引理。LGV 引理可以求所有划分不相交路径方式的贡献之和。一条路径的贡献定义为路径所有边的边权之积。

经典的套路,要知道最多有多少条不交的路径,就是随机赋边权,然后求 LGV 引理的矩阵 \(M\) 的秩。

具体地,\(M_{i,j}\) 定义为从 \(A_i\)\(B_j\) 所有路径权值之和。


目前 \(|A|\)\(|B|\) 都是 \(O(n)\) 的。

答案对 \(k\)\(\min\)

起点集合太大的情况,我们可以建 \(k\) 个虚点,分别连向起点集合所有的点。这样新增了 \(O(nk)\) 条边。

然后我们就只有 \(k\) 个起点了,\(M\)\(n\times k\) 的。

考虑按着 DAG 的拓扑序扫描终点集合 \(B\)。处理到真点 \(u\) 时,新的终点集合 \(B'\),对于其中一个假点 \(B_i'\),我们已知与它相邻的拓扑序较小的那个店的矩阵 \(M\),有 \(M_i' = \sum M_j w_{i,j}\),其中 \(w\) 是我们随机赋的边权。

然后你惊奇地发现,因为 \(w\) 是随机的,所以对于线性相关的 \(M_x,M_y\),你只需要加其中一个就可以了,因为总是存在随机 \(w\) 的方式使得某种随机权值下加两个的效果等同于另一种随机权值下加一个的效果。

因此我们对 \(M\) 的行向量求线性基。然后线性基的大小是 \(k \times k\) 的。

因此对于每条真边,都要做一次 \(O(k^2)\) 的转移,对每个真点得到一个 \(O(nk)\) 的矩阵,还要对矩阵求线性基,是 \(O(nk^2)\) 的。

因此总时间复杂度 \(O((n+m)k^2)\)。给了 \(15s\),包过的吧。

code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace proficient {constexpr int N=1e5+7,M=2e5+7,mod=1e9+7;mt19937 rd(random_device{}());int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }void _add(int &a,int b) { a=add(a,b); }int mul(int a,int b) { return 1ll*a*b%mod; }void _mul(int &a,int b) { a=mul(a,b); }int ksm(int a,int b=mod-2) { int s=1;while(b) {if(b&1) _mul(s,a);_mul(a,a);b>>=1;}return s;}int n,m,k;int u,v;vector<int> fr[N],tp,to[N];int in[N];int ans[N];struct node {int x[50];int &operator [] (int pos) { return x[pos-1]; }void clear() { memset(x,0,sizeof(x)); }}a;node operator * (node x,const int y) {rep(i,1,k) _mul(x[i],y);return x;}node operator += (node &x,node y) {rep(i,1,k) _add(x[i],y[i]);return x;}node operator -= (node &x,node y) {rep(i,1,k) _add(x[i],mod-y[i]);return x;}struct xxj {node x[50];node &operator [] (int pos) { return x[pos-1]; }void insert(node y) {rep(i,1,k) {if(!y[i]) continue;if(x[i-1][i]) {int d=mul(y[i],ksm(x[i-1][i]));y-=x[i-1]*d;}else {x[i-1]=y;return;}}}int size() {int cnt=0;rep(i,1,k) if(x[i-1][i]) ++cnt;return cnt;}}b[N+50];void main() {sf("%d%d%d",&n,&m,&k);rep(i,1,m) {sf("%d%d",&u,&v);in[v]++;fr[v].push_back(u);to[u].push_back(v);}queue<int> q;rep(i,1,n) if(!in[i]) q.push(i);while(!q.empty()) {int u=q.front();tp.push_back(u);q.pop();for(int v : to[u]) if(!(--in[v])) q.push(v);}rep(i,1,k) {// e[i+m]={i+n,1};fr[1].push_back(i+n);a.clear();a[i]=1;b[i+n].insert(a);}for(int u : tp) {int it=0;for(int v : fr[u]) {++it;a.clear();rep(i,1,k) {int w=abs((int)rd())%mod;if(b[v][i][i]) a+=b[v][i]*w;}b[u].insert(a);}ans[u]=b[u].size();}rep(i,2,n) pf("%d ",ans[i]);}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifproficient :: main();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别混乱!电商新年团队协作工具助你轻松应战

新年期间电商团队面临着巨大的工作量,而看板软件凭借其任务的可视化与分配、进度的实时跟踪与更新、沟通与协作的强化、个性化与定制化的满足以及多平台支持与便捷的移动办公等功能,成为了团队高效协作与沟通的得力助手,确保了电商业务在新年期间的平稳运行。看板软件凭借其…

整车电性能测试服务及设备开发

随着车辆电气化程度越来越高,整车电气系统面对更加严苛的工作环境,如何保障整车的电气可靠性越来越得到主机厂的关注。整车电性能测试是汽车电气系统开发过程中的一个关键环节,经纬恒润结合多年的整车电气工程经验,深度分解“整车-系统-子系统-部件-信号”等多个级别的性能…

springboot+shardingsphere实现读写分离和分表

参考:https://blog.csdn.net/weixin_44606481/article/details/140955787 前提:数据库配置了主从数据同步 1、依赖 <dependencies><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boo…

uniapp 荣耀手机 没有检测到设备 运行到Android手机 真机运行

背景: 使用uniapp框架搭建的项目,开发的时候在浏览器运行,因为项目要打包成App,所以需要真机联调,需要运行到Android手机,在手机上查看/运行项目。通过真机调试才能确保软件开发的准确性和页面显示的完整性。操作步骤:1.Usb连接手机和电脑,电脑上的HbuilderX打开项目;…

DC-5 靶场通关小记

rustscan端口扫描指纹识别、LFI漏洞+文件包含(nginx日志)GetShell、screen-4.5.0提权地址 https://www.vulnhub.com/entry/dc-5,314/环境配置 有兼容性问题参考 https://www.cnblogs.com/lrui1/p/18655388 信息收集 ./rustscan -a 192.168.74.130 -- -A -sC Open 192.168.74.13…

ABB IRB5500喷涂机械手维修细节查看

ABB IRB5500喷涂机器人的控制柜常见故障表现形式主要包括以下几种:1、控制柜不能启动:可能原因包括电源故障、控制电路板损坏、保险丝烧断等。处理方法包括检查电源是否正常、控制电路板是否有损坏迹象、保险丝是否烧断等。 2、abb涂装机械手控制柜报错或异常:可能原因包括…

新年新机遇:跨境电商选品策略大揭秘

跨境电商在进行新年选品时,需要综合考虑市场调研、竞争对手分析、品牌选择、价格定位、物流考虑、汇率研究、多元化产品线以及节日和特殊事件等多个因素。通过精心策划和准备,可以确保所选产品在新年期间取得良好的销售业绩。在进行跨境电商新年选品时,需要考虑多个因素以确…

年度重磅 |《2024华为开发者宝典》免费下载,多维度解读华为根生态技术

摘要:20多位华为云DTSE专家打造,10+技术领域全覆盖,图文干货+视频讲解,多维度解读华为根生态技术,拥抱技术变革,开启创新之旅。 一年一度!大家最期待的华为开发者宝典新鲜出炉!在刚刚过去的2024年,华为云开发者联盟通过25场精彩的DTSE Tech Talk直播活动,为广大开发者…

WPF页面中将一个控件的宽度绑定到其父级用户控件的实际宽度

通常情况下,使用相对宽度(如 * 星号单位)和适当的 HorizontalAlignment 是最简单有效的方法,可以确保子控件随着父控件的大小变化而自动调整。如果需要更精确的控制,可以考虑使用 RelativeSource 绑定或其他高级技术。确保父容器也支持子控件的动态尺寸调整非常重要。该实…

Windows 系统下 Docker 和 Docker Compose 安装配置:一键部署有来开源项目本地环境

在 Windows 系统上安装 Docker 和 Docker Compose,实现一键部署有来开源项目的本地环境,包括单体应用和微服务架构。🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCod…

Openfiler iscsi共享存储连接访问配置

Openfiler、iscsi案例说明: 通过openfiler虚拟机模拟iscsi server建立存储共享,测试多路径(multipath)配置。 测试架构:iscsi server网络配置:一、通过firefox浏览器访问openfiler服务配置 1、连接服务配置失败2、修改TLS认证级别3、连接访问openfiler配置服务二、配置op…

SQL Server数据库备份、差异备份、日志备份脚本.250108

1,sp脚本 USE [master] GO /****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 2025/1/8 10:43:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO-- Author: Amadeus-- Create date: 2021-10-20 exec sp_BackupDatabase L-- Descrip…