昨天由08的学长讲解了网络流的入门,加上自己之前看过算法导论里面的介绍,有了一点点粗浅的认识!学长给的话里最后一段我感觉很有意义!贴出来看看:

今天介绍的只是网络流中最基本一些问题,真正网络流博大精深,是研究生的一本必修课程。北邮的戴牛曾说过一切问题皆网络流,可见它的易用性。本人在有限的ACM生涯中也只是粗略入了门而已,大家练习做这种类型题目切忌百度,网络问题精华就在构图,图出来,什么都是浮云,如果一没思路马上百度,是无法入门,更别谈小成。

受益匪浅啊!
今天做最大流的问题,就遇到了建图苦难这个难题!认识了Dinic和EK两种算法!算是勉强会用,主要是学长留下的模板好用。
贴出来大家分享一下
先是EK的!
View Code

 1 int M,N; 2 int map[NN][NN]; 3 int mark[NN]; 4 int pre[NN]; 5 bool Bfs() 6 { 7 int que[NN]; 8     memset(mark,0,sizeof(mark)); 9     mark[0]=1;10     que[0]=0;11 int cur,i;12 int j,num=1;13 for (j=0;j<num;j++) 14     {15         cur=que[j];16 for(i=0;i<=N+1;i++)    //N+1 的位置代表总得点得个数17 if(map[cur][i]>0&&!mark[i])18             {19                 mark[i]=1;20                 pre[i]=cur; 21 if (i==N+1)   //走到最后了  返回122 returntrue;23                 que[num++]=i;24             }25     }26 returnfalse;27 }28 void Edmonds_Karp()29 {30 int maxFlow=0;31 int flow,tmp;32 while(Bfs())33     {       34 /*查找最小增流的时候,只查找最短路径上的点*/35         flow=INF;36         tmp=N+1;       //tmp 等于总得点数37 while(tmp!=0)38         {39 if(map[pre[tmp]][tmp]<flow)40                 flow=map[pre[tmp]][tmp];41             tmp = pre[tmp];42         }43         maxFlow+=flow;44         tmp=N+1;45 while(tmp!=0)      //0的意思是代表源点46         {47             map[pre[tmp]][tmp]-=flow;48             map[tmp][pre[tmp]]+=flow;49             tmp=pre[tmp];50         }51     }52     printf("%d\n",maxFlow);   53 }

下面是Dinic! 速度相对较快!就是代码复杂
View Code

 1 constint maxn=150000; 2 constint maxm=200000; 3 constint inf=1<<30; 4 struct edge 5 { 6 int from,to,val,next; 7 }map[maxn]; 8 int vis[maxn],que[maxn],dist[maxn],len; 9 void init()10 {11     len=0;12     memset(vis,-1,sizeof(vis));13 }14 void insert (int from,int to,int val)15 {16     map[len].from=from,map[len].to=to,map[len].val=val;17     map[len].next=vis[from];18     vis[from]=len++;19     map[len].from=to,map[len].to=from,map[len].val=0;20     map[len].next=vis[to];21     vis[to]=len++;22 }23 int Dinic(int n,int s,int t)24 {25 int ans=0;26 while(true)27     {28 int head,tail,id,i;29         head=tail=0;30         que[tail++]=s;31         memset(dist,-1,sizeof(dist));32         dist[s]=0;33 while(head<tail)34         {35             id=vis[que[head++]];36 while(id!=-1)37             {38 if(map[id].val>0&&dist[map[id].to]==-1)39                 {40                     dist[map[id].to]=dist[map[id].from]+1;41                     que[tail++]=map[id].to;42 if(map[id].to==t)43                     {44                         head=tail;45 break;46                     }47                 }48                 id=map[id].next;49             }50         }51 if(dist[t]==-1)52 break;53         id=s,tail=0;54 while(true)55         {56 if(id==t)       //找到一条增广路57             {58 int flow=inf,fir;59 for(i=0;i<tail;i++)60 if(map[que[i]].val<flow)61                     {62                         fir=i;63                         flow=map[que[i]].val;64                     }65 for(i=0;i<tail;i++)66                         map[que[i]].val-=flow,map[que[i]^1].val+=flow;67                     ans+=flow;68                     tail=fir;69                     id=map[que[fir]].from;70             }71             id=vis[id];72 while(id!=-1)73             {74 if(map[id].val>0&&dist[map[id].from]+1==dist[map[id].to])75 break;76                 id=map[id].next;77             }78 if(id!=-1)79             {80                 que[tail++]=id;81                 id=map[id].to;82             }83 else84             {85 if(tail==0)86 break;87                 dist[map[que[tail-1]].to]=-1;88                 id=map[que[--tail]].from;89             }90         }91     }92 return ans;93 }

其中   n为节点数,s为源点,t为汇点,每次使用先初始化!

建图的思考是网络流中的精髓!如果平时不思考!到比赛的时候就是必死了!

切记!

转载于:https://www.cnblogs.com/littlex/archive/2011/08/12/2136734.html

初识网络流(EK and Dinic 模板)相关推荐

  1. 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)

    //非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...

  2. 【网络流】最大流问题(EK算法带模板,Dinic算法带模板及弧优化,ISAP算法带模板及弧优化)上下界网络流

    本blog重点是代码 网络流的相关概念 流网络(flow network) 流(flow) 网络的流 残留网络(residual network) 增广路径(augmenting path) Edmo ...

  3. 最大流算法模板:EK和dinic算法

    最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...

  4. 网络流重制版:最大流Dinic,以及EK、Dinic时间复杂度的证明(含坑)

    文章目录 前言 关于最大流 神奇的术语 EK算法 Dinic 时间复杂度 EK Dinic 细节与一些神奇的性质 反向弧的作用以及代码边中的c 合法的f对应流 st有入边,ed有出边 双向边的两种处理 ...

  5. 网络流-EK求最大流

    网络流-EK求最大流 2021.8.17 网络流最大流解决什么问题? 网络流(network-flows)是一种类比水流的解决问题方法(摘自百度百科),最大流是求源点到汇点最大流量的方法. 算法原理 ...

  6. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

  7. 最大流EK和Dinic算法

    最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...

  8. 最大网络流算法之dinic算法

    文章目录 最大网络流 深度优先搜索 Dinic 第一个优化:高度数組 第二个优化 二.代码 最大网络流 首先要给出每一条线路的承载量,一定要把边都是有方向的.一定要指明一个源点跟目标点如图源点是A,目 ...

  9. usaco Drainage Ditches(网络流dinic模板)

    模板题 /* ID:jinbo wu TASK:ditch LANG:C++ */#include<bits/stdc++.h> using namespace std; #define ...

最新文章

  1. python-pcl官网 应用、特征、过滤Filter教程翻译
  2. 【C语言】用宏实现将一个整数的二进制位的奇数位和偶数位交换
  3. 省市区三级联动 数据精确到乡镇一级
  4. Java中Properties类的操作
  5. mysql 触发器学习
  6. SQL Server中Rollup关键字使用技巧
  7. (chap5 web服务器) 保存资源的缓存
  8. GraphQL入门之Schema和类型规范
  9. matlab中的tfrwv函数,求助,关于时频分布的
  10. 机器学习如何计算特征的重要性_机器学习之特征工程
  11. spring boot和spring cloud的区别_微服务实战系列(三)-cloud、boot及maven关系
  12. 精益企业中架构师的角色
  13. 车路云一体化融合控制系统
  14. Vue3 script setup
  15. 镜像iso文件下载地址
  16. 计算机英语总结800,高三英语教师工作总结800字(通用5篇)
  17. Counterfit 部署教程
  18. Android Studio实现连连看小游戏,比比看谁过关最快~
  19. 【Books系列】之第一本书:大冰《好吗好的》读书笔记和读后感
  20. 雷军与周鸿祎:冥冥中的恩人与冤家

热门文章

  1. tar、tar.gz、tar.Z、tgz、bz2、bin软件包的安装
  2. Lock-Free / Lockless 相关术语
  3. 对付洗稿者的一个脑洞
  4. 容器大小_C++复习篇(7)序列式容器vector
  5. web文件上传(二)--使用form还是ajax
  6. golang orm对比
  7. sap生产工单报工_SAP作业分割与作业价格计算说明
  8. oracle运维dba面试题,一份DBA面试题目---亲身经历
  9. 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍
  10. ideagit更新一个文件_idea使用ssh下载的git代码怎么没法更新