当前位置: 首页 > news >正文

P3376 【模板】网络最大流(EK算法)

贴上模版。

网络流真的很有意思,写最大流前必须要理解清楚增广等相关概念,推荐
oi wiki的讲解,潜心钻研一下相关证明。

EK算法大致思路:

①:在残留网络上不断找 s s s t t t 的增广路,记路径上残留容量最小值为 m n mn mn
②:给找到的增广路上的每条边上流量加 m n mn mn,给对应的反向边退掉 m n mn mn 的流量。
③:重复①和②步骤,直到找不到增广路,则此时得到最大流 ∣ f ∣ |f| f

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10010;int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();return x*f;
}int n,m,S,T,head[N],tot=1,mf[N],pre[N];
struct node{int to,nxt,c;
}edge[N];
void add(int x,int y,int w){edge[++tot].to=y;edge[tot].c=w;edge[tot].nxt=head[x];head[x]=tot;
}bool bfs(){queue<int> q;memset(mf,0,sizeof(mf));mf[S]=1e9,q.push(S);while(!q.empty()){int t=q.front();q.pop();for(int i=head[t];i;i=edge[i].nxt){int y=edge[i].to;if(!mf[y]&&edge[i].c){mf[y]=min(mf[t],edge[i].c);q.push(y),pre[y]=i;if(y==T) return true;}}}return false;
}ll EK(){ll flow=0;while(bfs()){int v=T;while(v!=S){int i=pre[v];edge[i].c-=mf[T],edge[i^1].c+=mf[T],v=edge[i^1].to;}flow+=mf[T];}return flow;
}int main(){n=read(),m=read(),S=read(),T=read();for(int i=1;i<=m;i++){int x=read(),y=read(),w=read();add(x,y,w),add(y,x,0);}cout<<EK()<<endl;return 0;
}

http://www.mrgr.cn/news/37568.html

相关文章:

  • 实战生成式(Generative)AI
  • 基于Python大数据可视化的短视频推荐系统
  • C语言理解 —— printf 格式化输出
  • SecureCRT的使用(Linux)
  • ASP.NET Core 打包net8.0框架在Linux CentOS7上部署问题
  • Nginx源码包------YUM安装
  • RabbitMQ 界面管理说明
  • 高校教师成果管理小程序的设计与实现springboot(lw+演示+源码+运行)
  • TypeScript 设计模式之【观察者模式】
  • 传奇外网架设全套图文教程-Hero引擎
  • 【mysql】理解一条sql的执行流程
  • 一站式自闭症全托服务,让孩子全面发展
  • unsqueeze函数、isinstance函数、_VF模块、squeeze函数
  • cdebug实战:容器调试的瑞士军刀
  • Maven项目常见各类 QA
  • Thingsboard规则链:Related Device Attributes节点详解
  • js设计模式(26)
  • vue单点登录异步执行请求https://xxx.com获取并处理数据
  • Map和Set,TreeMap和TreeSet,HashMap和HashSet
  • MongoDB简介