1. //非当前弧优化版
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <math.h>
  5. #include <cstring>
  6. #include <queue>
  7. #define INF 0x3f3f3f3f
  8. using namespace std;
  9. int tab[250][250];//邻接矩阵
  10. int dis[250];//距源点距离,分层图
  11. int N,M;//N:点数;M,边数
  12. queue<int> Q;
  13. int BFS()
  14. {
  15. memset(dis,0xff,sizeof(dis));//以-1填充
  16. dis[1]=0;
  17. Q.push(1);
  18. while (Q.size())
  19. {
  20. int head=Q.front();
  21. Q.pop();
  22. for (int i=1; i<=N; i++)
  23. if (dis[i]<0 && tab[head][i]>0)
  24. {
  25. dis[i]=dis[head]+1;
  26. Q.push(i);
  27. }
  28. }
  29. if (dis[N]>0) return 1;
  30. else return 0;//汇点的DIS小于零,表明BFS不到汇点
  31. }
  32. //dfs代表一次增广,函数返回本次增广的流量,返回0表示无法增广
  33. int dfs(int x,int low)//Low是源点到现在最窄的(剩余流量最小)的边的剩余流量
  34. {
  35. int a=0;
  36. if (x==N)
  37. return low;//是汇点
  38. for (int i=1; i<=N; i++)
  39. if (tab[x][i] >0 //联通
  40. && dis[i]==dis[x]+1 //是分层图的下一层
  41. &&(a=dfs(i,min(low,tab[x][i]))))//能到汇点(a != 0)
  42. {
  43. tab[x][i]-=a;
  44. tab[i][x]+=a;
  45. return a;
  46. }
  47. return 0;
  48. }
  49. int dinic()
  50. {
  51. int ans=0,tans;
  52. while (BFS())//要不停地建立分层图,如果BFS不到汇点才结束
  53. {
  54. while(tans=dfs(1,0x7fffffff))ans+=tans;//一次BFS要不停地找增广路,直到找不到为止
  55. }
  56. return ans;
  57. }
  58. int main()
  59. {
  60. int i,j,f,t,flow,tans;
  61. while (scanf("%d%d",&M,&N)!=EOF)
  62. {
  63. memset(tab,0,sizeof(tab));
  64. for (i=1; i<=M; i++)
  65. {
  66. scanf("%d%d%d",&f,&t,&flow);
  67. tab[f][t]+=flow;
  68. }
  69. printf("%d\n",dinic());
  70. }
  71. }
  1. //当前弧优化版
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <math.h>
  5. #include <cstring>
  6. #include <queue>
  7. #define INF 0x3f3f3f3f
  8. using namespace std;
  9. int tab[250][250];//邻接矩阵
  10. int dis[250];//距源点距离,分层图
  11. int cur[280]; //当前弧优化
  12. int N,M;//N:点数;M,边数
  13. queue<int> Q;
  14. int BFS()
  15. {
  16. memset(dis,0xff,sizeof(dis));//以-1填充
  17. dis[1]=0;
  18. Q.push(1);
  19. while (Q.size())
  20. {
  21. int head=Q.front();
  22. Q.pop();
  23. for (int i=1; i<=N; i++)
  24. if (dis[i]<0 && tab[head][i]>0)
  25. {
  26. dis[i]=dis[head]+1;
  27. Q.push(i);
  28. }
  29. }
  30. if (dis[N]>0) return 1;
  31. else return 0;//汇点的DIS小于零,表明BFS不到汇点
  32. }
  33. //dfs代表一次增广,函数返回本次增广的流量,返回0表示无法增广
  34. int dfs(int x,int low)//Low是源点到现在最窄的(剩余流量最小)的边的剩余流量
  35. {
  36. int a=0;
  37. if (x==N)
  38. return low;//是汇点
  39. for (int &i=cur[x]; i<=N; i++)
  40. if (tab[x][i] >0 //联通
  41. && dis[i]==dis[x]+1 //是分层图的下一层
  42. &&(a=dfs(i,min(low,tab[x][i]))))//能到汇点(a != 0)
  43. {
  44. tab[x][i]-=a;
  45. tab[i][x]+=a;
  46. return a;
  47. }
  48. return 0;
  49. }
  50. int dinic()
  51. {
  52. int ans=0,tans;
  53. while (BFS())//要不停地建立分层图,如果BFS不到汇点才结束
  54. {
  55. for(int i=1;i<=N;i++)
  56. cur[i]=1;
  57. while(tans=dfs(1,0x7fffffff))ans+=tans;//一次BFS要不停地找增广路,直到找不到为止
  58. }
  59. return ans;
  60. }
  61. int main()
  62. {
  63. int i,j,f,t,flow,tans;
  64. while (scanf("%d%d",&M,&N)!=EOF)
  65. {
  66. memset(tab,0,sizeof(tab));
  67. for (i=1; i<=M; i++)
  68. {
  69. scanf("%d%d%d",&f,&t,&flow);
  70. tab[f][t]+=flow;
  71. }
  72. printf("%d\n",dinic());
  73. }
  74. }

网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)的更多相关文章

  1. 网络流--最大流dinic模板

    标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...

  2. 网络流-最大流 Dinic模板

    #include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...

  3. 网络流最大流——dinic算法

    前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...

  4. [讲解]网络流最大流dinic算法

    网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...

  5. 【模板】网络流-最大流 Dinic

    洛谷 3376 #include<cstdio> #include<algorithm> #include<cstring> #define N 10010 #de ...

  6. Power Network(网络流最大流 & dinic算法 + 优化)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24019   Accepted: 12540 D ...

  7. POJ训练计划1459_Power Network(网络流最大流/Dinic)

    解题报告 这题建模实在是好建.,,好贱.., 给前向星给跪了,纯dinic的前向星居然TLE,sad.,,回头看看优化,.. 矩阵跑过了.2A,sad,,, /******************** ...

  8. 最大流dinic模板

    循环版,点的编号从0开始: ; ; const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM]; in ...

  9. 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

    题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...

随机推荐

  1. CVPR2018关键字分析生成词云图与查找

    今日目标:爬取CVPR2018论文,进行分析总结出提到最多的关键字,生成wordCloud词云图展示,并且设置点击后出现对应的论文以及链接 对任务进行分解: ①爬取CVPR2018的标题,简介,关键字 ...

  2. C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作.本篇文章利用C+ ...

  3. SQL基础系列(4)-性能优化建议

    10.1 连接查询表的顺序问题 SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包 ...

  4. 最长公共子窜和最长公共子序列(LCS)

    他们都是用dp做;复杂度都是O(N方) 有一个大佬的博客写的很详细,是关于最长公共子序列的:https://blog.csdn.net/hrn1216/article/details/51534607 ...

  5. AJ学IOS(55)多线程网络之图片下载框架之SDWebImage

    AJ分享,必须精品 效果: 代码: - (NSArray *)apps { if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsO ...

  6. AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI

    AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...

  7. Spring Boot 和 Spring Cloud 应用内存如何管理?

    在整体应用架构中,非生产环境情况下,一般 1GB 或者 2GB 的 RAM 就足够了.如果我们将这个应用程序划分为 20 或 30 个独立的微服务,那么很难期望 RAM 仍将保持在 1GB 或 2GB ...

  8. 跨平台开源密码管理器 KeePassXC

    简介 KeePassXC 是一个开源的跨平台密码管理器.基于 KeePass 二次开发. KeePassXC 可以安全地在本地存储您的密码,配合浏览器插件KeePassXC-Browser可辅助登录. ...

  9. selenium获取多窗口句柄并一切换至原窗口句柄(三个窗口)

    网上有很多是selenium基于python来获取两个窗口句柄与切换,本文实现用python+selenium获取多窗口句柄并一一切换至原窗口句柄(三个窗口),且在每个窗口下进行一个搜索或翻译,然后截 ...

  10. 解决报错:JPA-style positional param was not an integral ordinal;

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...