复杂度上界为 \(\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());
}

最新文章

  1. 像黑客一样使用 Linux 命令行
  2. 使用复合设计模式扩展持久化的CURD,Select能力
  3. Asp.net Mvc中分部视图获取后台数据并展示
  4. Spark Netty与Jetty (源码阅读十一)
  5. 照片大管家iOS-实现本地相册、视频、安全保护、社交分享一站式功能,源码开放
  6. 集中式版本控制系统:从svn到tfs
  7. 20145208《Java程序设计》第3周学习总结
  8. 利用JAVA Service Wrapper把JAVA程序做成windows服务
  9. Falcon Genome Assembly Tool Kit Manual
  10. 001.android初级篇之ToolBar
  11. iOS sharedSDK详解
  12. 笔记28 mssql的update :from语法
  13. UNIX网络编程——内网与外网间通信
  14. 关于火狐和IE下href=&quot;javascript:void(0)&quot;兼容性的问题
  15. Node.js学习记录(一)--安装设置篇
  16. 初识NLTK
  17. kruskal算法:POJ No.3723 Conscription_最小生成树应用_最大权森林
  18. Java 正则表达式 过滤html标签
  19. [HAOI2006]l旅行
  20. gulp:入门简介

热门文章

  1. 19.-哈希算法&amp;注册登录
  2. Day16异常1
  3. JavaScript之数组高阶API—reduce()
  4. Oracle数据泵导入dmp文件,报UDI-00013、UDI-00019错误原因
  5. docker安装消息队列(rabbitmq)及数据库(mongo、mysql)
  6. 安装 TypeScript 并编译成JS
  7. 【笔记】CF1251E Voting 及相关
  8. 第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
  9. Go语言核心36讲18
  10. SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况