初识网络流(EK and Dinic 模板)
昨天由08的学长讲解了网络流的入门,加上自己之前看过算法导论里面的介绍,有了一点点粗浅的认识!学长给的话里最后一段我感觉很有意义!贴出来看看:
今天介绍的只是网络流中最基本一些问题,真正网络流博大精深,是研究生的一本必修课程。北邮的戴牛曾说过一切问题皆网络流,可见它的易用性。本人在有限的ACM生涯中也只是粗略入了门而已,大家练习做这种类型题目切忌百度,网络问题精华就在构图,图出来,什么都是浮云,如果一没思路马上百度,是无法入门,更别谈小成。
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 }
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 模板)相关推荐
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- 【网络流】最大流问题(EK算法带模板,Dinic算法带模板及弧优化,ISAP算法带模板及弧优化)上下界网络流
本blog重点是代码 网络流的相关概念 流网络(flow network) 流(flow) 网络的流 残留网络(residual network) 增广路径(augmenting path) Edmo ...
- 最大流算法模板:EK和dinic算法
最大流算法模板:EK和dinic算法 一.EK算法模板 #include<iostream> #include<queue> using namespace std; cons ...
- 网络流重制版:最大流Dinic,以及EK、Dinic时间复杂度的证明(含坑)
文章目录 前言 关于最大流 神奇的术语 EK算法 Dinic 时间复杂度 EK Dinic 细节与一些神奇的性质 反向弧的作用以及代码边中的c 合法的f对应流 st有入边,ed有出边 双向边的两种处理 ...
- 网络流-EK求最大流
网络流-EK求最大流 2021.8.17 网络流最大流解决什么问题? 网络流(network-flows)是一种类比水流的解决问题方法(摘自百度百科),最大流是求源点到汇点最大流量的方法. 算法原理 ...
- 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化
题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...
- 最大流EK和Dinic算法
最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...
- 最大网络流算法之dinic算法
文章目录 最大网络流 深度优先搜索 Dinic 第一个优化:高度数組 第二个优化 二.代码 最大网络流 首先要给出每一条线路的承载量,一定要把边都是有方向的.一定要指明一个源点跟目标点如图源点是A,目 ...
- usaco Drainage Ditches(网络流dinic模板)
模板题 /* ID:jinbo wu TASK:ditch LANG:C++ */#include<bits/stdc++.h> using namespace std; #define ...
最新文章
- python-pcl官网 应用、特征、过滤Filter教程翻译
- 【C语言】用宏实现将一个整数的二进制位的奇数位和偶数位交换
- 省市区三级联动 数据精确到乡镇一级
- Java中Properties类的操作
- mysql 触发器学习
- SQL Server中Rollup关键字使用技巧
- (chap5 web服务器) 保存资源的缓存
- GraphQL入门之Schema和类型规范
- matlab中的tfrwv函数,求助,关于时频分布的
- 机器学习如何计算特征的重要性_机器学习之特征工程
- spring boot和spring cloud的区别_微服务实战系列(三)-cloud、boot及maven关系
- 精益企业中架构师的角色
- 车路云一体化融合控制系统
- Vue3 script setup
- 镜像iso文件下载地址
- 计算机英语总结800,高三英语教师工作总结800字(通用5篇)
- Counterfit 部署教程
- Android Studio实现连连看小游戏,比比看谁过关最快~
- 【Books系列】之第一本书:大冰《好吗好的》读书笔记和读后感
- 雷军与周鸿祎:冥冥中的恩人与冤家
热门文章
- tar、tar.gz、tar.Z、tgz、bz2、bin软件包的安装
- Lock-Free / Lockless 相关术语
- 对付洗稿者的一个脑洞
- 容器大小_C++复习篇(7)序列式容器vector
- web文件上传(二)--使用form还是ajax
- golang orm对比
- sap生产工单报工_SAP作业分割与作业价格计算说明
- oracle运维dba面试题,一份DBA面试题目---亲身经历
- 【每日一题】Leetcode 刷题 二叉树-树的遍历 介绍
- ideagit更新一个文件_idea使用ssh下载的git代码怎么没法更新