题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。

输入输出格式

输入格式:

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)

输出格式:

一行,包含一个正整数,即为该网络的最大流。

输入输出样例

输入样例:

4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
输出样例:

50

样例说明:

题目中存在3条路径:

4-->2-->3,该路线可通过20的流量

4-->3,可通过20的流量

4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)

故流量总计20+20+10=50。输出50。


说明

对于100%的数据:N<=10000,M<=100000

struct MaxFlow{
struct Edge{
int to,c,pre;
}e[M];
int sz=,S,T;
int H[N],las[N],cur[N],gap[N]; void Add(int a,int b,int c){
e[++sz]=(Edge){b,c,las[a]}; las[a]=sz;
e[++sz]=(Edge){a,,las[b]}; las[b]=sz;
}
int ISAP(int x,int F,int usd=){
if (x==T) return F;
for (int i=cur[x],v;i;i=e[i].pre)
if (e[i].c && H[v=e[i].to]+==H[x]){
int f=ISAP(v,min(e[i].c,F-usd));
e[i].c-=f; e[i^].c+=f;
usd+=f;
if (e[i].c) cur[x]=i;
if (usd==F) return usd;
}
if (gap[H[x]]==) H[S]=n+;
--gap[H[x]]; ++gap[++H[x]];
cur[x]=las[x];
return usd;
}
int Maxflow(int Ans=){
while (H[S] < n+) Ans+=ISAP(S,INF);
return Ans;
}
}G;

最新文章

  1. JS对象继承篇
  2. iOS面试用到的知识点和技术点--第二章
  3. cx_oracle 执行cur.execute(sql)提交数据出现 UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode character u&#39;\u2122&#39; in position 170
  4. mysql授权登录用户
  5. Express安装过程
  6. 产品Backlog
  7. USB协议-USB设备的枚举过程
  8. bootstrap的警告框
  9. 编写 Window 服务程序
  10. vb socket的使用
  11. ansible-plabybook 常用的有用的命令
  12. Spring声明式事务配置
  13. Python——Menu控件
  14. CodeForces - 455D
  15. 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理
  16. MacOS使用常用配置
  17. (3)Oracle基础--表
  18. Syncthing源码解析 - 启动过程
  19. &quot;_dns_free_resource_record&quot;, referenced from:问题
  20. TTS技术

热门文章

  1. SNMP TRAP报文解析
  2. List集合中的对象进行排序
  3. Ubuntu16.04安装搜狗拼音输入法
  4. 第十一次ScrumMeeting博客
  5. mongodb基本使用(四)
  6. 深入 JSX
  7. 团队博客作业Week5 --- 团队贡献分--分配规则
  8. 第一次作业——MathExam285
  9. iOS学习资源搜集
  10. beat冲刺(5/7)