【模板】网络最大流 Dinic(多路增广+当前弧优化)
2024-09-18 15:24:12
复杂度上界为 \(\Theta(n^2m)\),实际效率远高于此。
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int M=1e6+5;
const int MN=1e3+5;
typedef long long ll;
inline int read(){int x(0), f(0); char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();} return f?-x:x;}
template <typename T> void read(T &x){x=0; T f(0); char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();} x=f?-x:x;}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){read(x);read(arg...);}
template <typename T> inline void write(T x){static char buf[64]; static int tot(0); if(x<0) putchar('-'),x=-x; do buf[++tot]=(x%10)+48,x/=10; while(x); do putchar(buf[tot--]); while(tot);}
template <typename T> void write(T x,char c){static char buf[64]; static int tot(0); if(x<0) putchar('-'),x=-x; do buf[++tot]=(x%10)+48,x/=10; while(x); do putchar(buf[tot--]); while(tot); putchar(c);}
void Solve();
struct Graph{
int to, next;
ll w;
}G[M << 1];
int _head[N], cur[N], cnt(1);
void addEdge(int u,int v,int w = 1){G[++cnt] = (Graph){v, _head[u], w}; _head[u] = cnt;}
int n,m,s,t;
int main(){
// Multicase()
Solve();
}
int dep[N],que[N];
bool bfs(){
memcpy(cur + 1, _head + 1, (n + 5) * sizeof(cur[0]));
memset(dep, 0, (n + 5) * sizeof(dep[0]));
dep[s] = 1;
int head = 1, tail = 0; que[++tail] = s;
while(tail >= head){
int u = que[head++];
for(int i = _head[u]; i; i = G[i].next){
int t = G[i].to;
if(G[i].w && !dep[t]){
dep[t] = dep[u] + 1;
que[++tail] = t;
}
}
}
return dep[t];
}
ll dfs(int now, ll flow){
ll tot = 0, f = 0;
if(now == t || flow == 0) return flow;
for(int i = cur[now]; i; i = G[i].next){
cur[now] = i;
int t = G[i].to;
if(G[i].w && dep[t] == dep[now] + 1){
if(f = dfs(t, min(flow, G[i].w))){
G[i].w -= f;
G[i ^ 1].w += f;
tot += f;
flow -= f;
if(flow == 0) break;
}
}
}
return tot;
}
ll dinic(){
ll maxflow = 0;
while(bfs()) maxflow += dfs(s, 1<<30);
return maxflow;
}
void Solve(){
read(n, m);
s = 1, t = n;
for(int i = 1; i <= m; i++){
int u, v, w;
read(u, v, w);
addEdge(u, v, w);
addEdge(v, u, 0);
}
printf("%lld\n", dinic());
}
最新文章
- 像黑客一样使用 Linux 命令行
- 使用复合设计模式扩展持久化的CURD,Select能力
- Asp.net Mvc中分部视图获取后台数据并展示
- Spark Netty与Jetty (源码阅读十一)
- 照片大管家iOS-实现本地相册、视频、安全保护、社交分享一站式功能,源码开放
- 集中式版本控制系统:从svn到tfs
- 20145208《Java程序设计》第3周学习总结
- 利用JAVA Service Wrapper把JAVA程序做成windows服务
- Falcon Genome Assembly Tool Kit Manual
- 001.android初级篇之ToolBar
- iOS sharedSDK详解
- 笔记28 mssql的update :from语法
- UNIX网络编程——内网与外网间通信
- 关于火狐和IE下href=";javascript:void(0)";兼容性的问题
- Node.js学习记录(一)--安装设置篇
- 初识NLTK
- kruskal算法:POJ No.3723 Conscription_最小生成树应用_最大权森林
- Java 正则表达式 过滤html标签
- [HAOI2006]l旅行
- gulp:入门简介
热门文章
- 19.-哈希算法&;注册登录
- Day16异常1
- JavaScript之数组高阶API—reduce()
- Oracle数据泵导入dmp文件,报UDI-00013、UDI-00019错误原因
- docker安装消息队列(rabbitmq)及数据库(mongo、mysql)
- 安装 TypeScript 并编译成JS
- 【笔记】CF1251E Voting 及相关
- 第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
- Go语言核心36讲18
- SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况