开long long的最大流

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const long long MAXN = ;//点数的最大值
  4. const long long MAXM = ;//边数的最大值
  5. const long long INF = 1e15 + ;
  6. struct Edge
  7. {
  8. long long to,next,cap,flow;
  9. } edge[MAXM]; //注意是MAXM
  10. long long tol;
  11. long long head[MAXN];
  12. long long gap[MAXN],dep[MAXN],cur[MAXN];
  13. long long n, m, s, t;
  14. void init()
  15. {
  16. tol = ;
  17. memset(head,-,sizeof(head));
  18. }
  19. void addedge(long long u,long long v,long long w,long long rw = )
  20. {
  21. edge[tol].to = v;
  22. edge[tol].cap = w;
  23. edge[tol].flow = ;
  24. edge[tol].next = head[u];
  25. head[u] = tol++;
  26. edge[tol].to = u;
  27. edge[tol].cap = rw;
  28. edge[tol].flow = ;
  29. edge[tol].next = head[v];
  30. head[v] = tol++;
  31. }
  32. long long Q[MAXN];
  33. void BFS(long long start,long long end)
  34. {
  35. memset(dep,-,sizeof(dep));
  36. memset(gap,,sizeof(gap));
  37. gap[] = ;
  38. long long front = , rear = ;
  39. dep[end] = ;
  40. Q[rear++] = end;
  41. while(front != rear)
  42. {
  43. long long u = Q[front++];
  44. for(long long i = head[u]; i != -; i = edge[i].next)
  45. {
  46. long long v = edge[i].to;
  47. if(dep[v] != -)
  48. continue;
  49. Q[rear++] = v;
  50. dep[v] = dep[u] + ;
  51. gap[dep[v]]++;
  52. }
  53. }
  54. }
  55. long long S[MAXN];
  56. long long sap(long long start,long long end,long long N)
  57. {
  58. BFS(start,end);
  59. memcpy(cur,head,sizeof(head));
  60. long long top = ;
  61. long long u = start;
  62. long long ans = ;
  63. while(dep[start] < N)
  64. {
  65. if(u == end)
  66. {
  67. long long Min = INF;
  68. long long inser;
  69.  
  70. for(long long i = ; i < top; i++)
  71. if(Min > edge[S[i]].cap - edge[S[i]].flow)
  72. {
  73. Min = edge[S[i]].cap - edge[S[i]].flow;
  74. inser = i;
  75. }
  76. for(long long i = ; i < top; i++)
  77. {
  78. edge[S[i]].flow += Min;
  79. edge[S[i]^].flow -= Min;
  80. }
  81. ans += Min;
  82. top = inser;
  83. u = edge[S[top]^].to;
  84. continue;
  85. }
  86. bool flag = false;
  87. long long v;
  88. for(long long i = cur[u]; i != -; i = edge[i].next)
  89. {
  90. v = edge[i].to;
  91. if(edge[i].cap - edge[i].flow && dep[v]+ == dep[u])
  92. {
  93. flag = true;
  94. cur[u] = i;
  95. break;
  96. }
  97. }
  98. if(flag)
  99. {
  100. S[top++] = cur[u];
  101. u = v;
  102. continue;
  103. }
  104. long long Min = N;
  105. for(long long i = head[u]; i != -; i = edge[i].next)
  106. if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min)
  107. {
  108. Min = dep[edge[i].to];
  109. cur[u] = i;
  110. }
  111. gap[dep[u]]--;
  112. if(!gap[dep[u]])
  113. return ans;
  114. dep[u] = Min + ;
  115. gap[dep[u]]++;
  116. if(u != start)
  117. u = edge[S[--top]^].to;
  118. }
  119. return ans;
  120. }
  121. int main(){
  122. init();
  123. scanf("%lld %lld %lld %lld", &n , &m, &s, &t);
  124. for(long long i = ; i < m; i++){
  125. long long u, v, w;
  126. scanf("%lld %lld %lld", &u, &v, &w);
  127. addedge(u,v,w);
  128. }
  129. printf("%lld\n", sap(s,t,n));
  130. }

LOJ 101 最大流(ISAP 模板)的更多相关文章

  1. [loj#101] 最大流 网络流模板

    #101. 最大流 内存限制:512 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 这是一道模板题. 给定  ...

  2. 最大流isap模板

    isap+bfs初始化+栈优化,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }ed ...

  3. loj#101. 最大流 dinic+当前弧

    板子题 当前弧优化版本 目前效率最高 //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize(&q ...

  4. loj 101 最大流

    冬令营送到我脸上的20分都没拿全 心态爆炸 冬令营前一天学的dinic 后一天才发出来 #include<iostream> #include<cstdio> #include ...

  5. 【最大流ISAP】洛谷P3376模板题

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  6. [模板] 网络流相关/最大流ISAP/费用流zkw

    最大流/ISAP 话说ISAP是真快...(大多数情况)吊打dinic,而且还好写... 大概思路就是: 在dinic的基础上, 动态修改层数, 如果终点层数 \(>\) 点数, break. ...

  7. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  8. HDU 4280:Island Transport(ISAP模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:在最西边的点走到最东边的点最大容量. 思路:ISAP模板题,Dinic过不了. #include & ...

  9. POJ-2135-Farm Tour(最大费用最小流)模板

    Farm Tour POJ - 2135 When FJ's friends visit him on the farm, he likes to show them around. His farm ...

随机推荐

  1. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中st ...

  2. PHP正则表达式 - 元字符

    下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 " ...

  3. The great pleasure in life is doing what people say you cannot do.

    The great pleasure in life is doing what people say you cannot do.  人生最大的快乐是做到别人认为你做不到的事情.

  4. 多线程-Thread-Runnable

    一.多线程     1.基本概念         进程:正在运行中的程序,一个进程中至少包含一个线程         线程:进程的任务,执行任务的一个通道,一个进程中可以包含多个线程     2.多线 ...

  5. (笔记)快速入门PADS logic 到 layout

    以前从未接触过画板,先是硬着头皮边学边操作<Layout2007中文教程之PADS_Logic>,刚好在中秋节前把这个教程从头到尾通学了一遍,随后感觉这个教程有了方方面面但没有工程的系统性 ...

  6. Ionic 2 中的创建一个闪视卡片组件

    闪视卡片是记忆信息的重要工具,它的使用可以追溯到19世纪.我们将要创建一个很酷的短暂动画来实现它.看起来像是这个样子的: 闪视卡片示例 Ionic 2 实例开发 新增章节将为你介绍如何在Ionic 2 ...

  7. copyout函数

    copyout Kernel Service   Purpose Copies data between user and kernel memory. Syntax #include <sys ...

  8. 查询日志logcat使用总结

    cmd命令行中使用adb logcat命令查看Android系统和应用的log,dos窗口按ctrl+c中断输出log记录.logcat日志中的优先级/tag标记: android输出的每一条日志都有 ...

  9. oracle 11g r2安装

    安装环境:windows 7 安装版本:Oracle_win32_11gR2 目的:用于模拟服务器环境,学习Oracle操作 1. 下载oracle 11g r2,下载地址:www.oracle.co ...

  10. BZOJ 4777: [Usaco2017 Open]Switch Grass

    4777: [Usaco2017 Open]Switch Grass Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 10[Su ...