最大流之上下界可行流

news/2024/12/19 0:23:23/文章来源:https://www.cnblogs.com/mendax-Z/p/18616098

一.无汇源上下界可行流

#include<bits/stdc++.h>#define x first
#define y second
#define endl '\n'
#define int long longusing namespace std;const int N=10010,M=200010,INF=1e15;//根据边的大小,来调整N,M,INFint n,m,S,T;
int h[N],e[M],f[M],l[M],ne[M],idx;//l数组记录的是每条边的下界
int q[N],d[N],cur[N],A[N];//A[i]表示所有进入i这个点的边的流量下界之和-所有从i点出去的边的流量下界之和void add(int a,int b,int c,int d){e[idx]=b,f[idx]=d-c,l[idx]=c,ne[idx]=h[a],h[a]=idx++;e[idx]=a,f[idx]=0,ne[idx]=h[b],h[b]=idx++;
}bool bfs(){//规划分层图,然后判断是否存在增广路int hh=0,tt=0;memset(d,-1,sizeof d);q[0]=S,d[S]=0,cur[S]=h[S];//起点的层数为0while(hh<=tt){int t=q[hh++];for(int i=h[t];~i;i=ne[i]){int ver=e[i];if(d[ver]==-1&&f[i]){//只有这条边有流量的时候,才能继续走下去d[ver]=d[t]+1;cur[ver]=h[ver];if(ver==T)return true;//如果能搜到T的话,那么就说明可以找到一条增广路q[++tt]=ver;}}}return false;
}int find(int u,int limit){if(u==T) return limit;int flow=0;for(int i=cur[u];~i&&flow<limit;i=ne[i]){//当前弧优化cur[u]=i;int ver=e[i];if(d[ver]==d[u]+1&&f[i]){int t=find(ver,min(f[i],limit-flow));if(!t) d[ver]=-1;f[i]-=t,f[i^1]+=t,flow+=t;}}return flow;
}int dinic(){int ans=0,flow;while(bfs()) while(flow=find(S,INF)) ans+=flow;return ans;
}void slove(){memset(h,-1,sizeof h);cin>>n>>m;S=0,T=n+1;for(int i=0;i<m;i++){int a,b,c,d;cin>>a>>b>>c>>d;add(a,b,c,d);A[a]-=c,A[b]+=c;}int tot=0;for(int i=1;i<=n;i++){if(A[i]>0) add(S,i,0,A[i]),tot+=A[i];else if(A[i]<0) add(i,T,0,-A[i]);}if(dinic()!=tot)cout<<"NO"<<endl;else{cout<<"YES"<<endl;for(int i=0;i<m*2;i+=2){cout<<f[i^1]+l[i]<<endl;//当前边的流量就是反向边t的f[t];}}     
}signed main(){ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int T=1;while(T--) slove();
}

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

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

相关文章

项目中ES踩坑记录

当用到script score query 时,出现java 异常 这种异常多半是对检索出来的数据进行script计算的时候出错了,大多数是空指针异常情况。 解决思路是: 1.在query条件中,将需要script计算的字段的数据过滤掉。比如用到了feature字段进行计算的时候,需要保证feature有值并且是512…

从“bug”到“成就感”——软件工程大冒险

从“bug”到“成就感”——软件工程大冒险 这一学期的《软件工程》简直可以称为我的“技术冒险之旅”。从最初的迷茫,到逐渐掌握核心技能,再到团队合作中的互助与共识,到最后顺利完成项目时的“轻舟已过万重山”,经历了从“bug”到“成就感”的转变,既有汗水,也有欢笑。回…

【AI安全漏洞】VLLM反序列化漏洞分析与保姆级复现(附批量利用)

#CVE-2024-9052环境需要 Linux(这里使用kali)、Anaconda首先安装Anaconda 前言 最好使用linux,如果使用windows可能会产生各种报错(各种各种各种!!!),最好使用Anaconda,方便独立管理虚拟机 使用conda创建虚拟机、python要求3.10 conda create -n vllm_beam python=3.…

动态数据源 @DS 注解源码解析

参考:动态数据源切换——@DS 注解源码解析前言 借助 dynamic-datasource 可实现多数据源读写,其核心注解@DS用来动态切换数据源。 下面介绍@DS注解的实现原理。 如何使用 在 pom 中引入依赖: <!-- spring-boot 1.5.x 2.x.x --> <dependency><groupId>com.…

【开源系列】CentOS7下Docker环境搭建开源堡垒机Apache Guacamole

Apache Guacamole 是一个无客户端远程桌面网关。它支持 VNC、RDP 和 SSH 等标准协议。不需要插件或客户端软件。借助 HTML5,一旦在服务器上安装了 Guacamole,只需使用 Web 浏览器即可访问桌面。 1.Guacamole的架构介绍 Guacamole不是一个独立的网络应用程序,而是由多个部分组…

ThreeJs-07操控物体实现家具编辑器

本章节实现效果,通过gui快速添加场景,家具,并且可以快速设置家具实现一个编辑器效果一.基础设置与物体添加列表 用之前做过的一个案例来改首先不要这个模型,然后换个背景颜色,并且添加一个网格辅助器1.1 添加场景 先往事件对象里面添加一个函数,到时候点击就会调用这个函…

数据集划分;参数超参数;交叉验证

在机器学习和深度学习中,将数据分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)是常见的做法,每部分数据承担不同的任务: 一.基本概念 1.训练集(Training Set):训练集用于训练模型,即通过算法调整模型的参数以最小化损失函数(Loss Function…

爱米导航网(imi),您的互联网书签搭子

爱米导航(Imi)网是一个综合性的互联网资源聚合平台,它以其丰富的内容和便捷的服务受到了广大用户的喜爱。该网站收录了数千个不同类型的互联网工具网站,覆盖了AI工具、自媒体运营工具、产品经理工具以及UI设计师工具等多个领域,为用户提供了一个一站式的解决方案。 爱米导…

记录一次springboot启动流程不完整版

1.Sort ApplicationInitializer:2.sort Listener:3.getRunListener:4.eventPublishingRunListener.starting 发布启动中事件; 构建 ApplicationArguments 参数, 4.1prepareEnvement: [StubPropertySource {name=servletConfigInitParams}, StubPropertySource {name=servletC…

键盘连击软件解决方案

解决的问题 jjjjjjjjjjjjjjjj键盘连击了,windows系统中的“筛选键”功能就能短暂解决这个问题,可是筛选的时间太长无法在面板设置更短的时间,但可以使用软件解决。 方法一 系统 筛选键 win+i 打开设置 -> 搜索“筛选键” -> 打开筛选键开关 使用限制:重复键最低只能设…

【建议收藏】最新版IDEA2024.3及 AI Assistant 一键激活到2099

成功永久激活 一、支持的IDE和版本支持JB家族所有IDE激活 支持版本为2021.3~2024.1二、如何破解激活 第一步:激活工具下载 为了防止破解工具被删除,通过公众号回复“「永久激活」”获取下载最新工具(如过期,请记得提醒我哦) 关注公众号后台回复“「永久激活」”,获取最新…

《平衡树》读后感

第一框,世界属于fhq-treap 是什么? 你说的对,但是《fhq-treap》是由范浩强自主研发的一款全新树形数据结构。数据结构发生在一个被称作「二叉搜索树」的幻想世界,在这里,被人创造的节点将被授予「随机优先级」,导引期望 \(O(\log n)\) 之力。treap 将扮演一位名为「根据优…