今天上午我仿佛知道了什么叫做网络流,这里推荐一篇博客,大家入门网络流的可以看一下这篇博客,保证一看就懂!

博客链接:
网络流入门

这里有一篇经过我改过的EK带注释代码(博客里也有一样的,只是加了一些注释),大家可以看一下:

//codevs 1993
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int INF=0x7ffffff;queue <int> q;
int n,m,x,y,s,t,g[201][201],pre[201],flow[201],maxflow;
//g邻接矩阵存图,pre增广路径中每个点的前驱,flow源点到这个点的流量 (就是増广路(min))! inline int bfs(int s,int t)
{while (!q.empty()) q.pop();//清空! for (int i=1; i<=n; i++) pre[i]=-1;//清空!!! pre[s]=0;q.push(s);flow[s]=INF;while (!q.empty()){int x=q.front();q.pop();if (x==t) break;for (int i=1; i<=n; i++)//EK一次只找一个增广路 ,这句话非常的重要啊!!!!!important! very important! very very important!!!//不认真看这句话,不要怪下面自己看不懂! if (g[x][i]>0 && pre[i]==-1)//如果当时x到i点有容量,并且i点还没有找到前驱 {pre[i]=x;flow[i]=min(flow[x],g[x][i]);//是不是觉得有一点像SPFA ??? 找最小的増广路 q.push(i);}}if (pre[t]==-1) return -1;//死啦! else return flow[t];
}//increase为增广的流量
void EK(int s,int t)
{int increase=0;while ((increase=bfs(s,t))!=-1)//这里的括号加错了!Tle {//迭代 int k=t;//k等于终点 while (k!=s)//当k不为起点时 {int last=pre[k];//从后往前找路径g[last][k]-=increase;//正着走残量网络要减去增广量 g[k][last]+=increase;//反之,反着走要加上增广量 k=last;}maxflow+=increase;//增加増广路 }
}int main()
{scanf("%d%d",&m,&n);//m是挖了几条沟,n是有几条汇点 ,最后一个点n也是小溪的编号 for (int i=1; i<=m; i++){int z;scanf("%d%d%d",&x,&y,&z);g[x][y]+=z;//此处不可直接输入,要+= ,为什么???????????????important }EK(1,n);printf("%d",maxflow);return 0;
}

下面大家就会发现一个问题,用邻接矩阵存储,是不是也太费空间了,要是题目让你跑一个有10000个点的网络流岂不凉凉!!!

下面就要献上我们改装过的EK算法!(说白了就是Dinic)

#include<bits/stdc++.h>
using namespace std;
struct listx{int to,next=0,f;
}edge[200005];
int cnt=0,n,m,s,t;
int head[10005];
int depth[10005];
void update(int num,int flow)
{edge[num].f-=flow;edge[num+1].f+=flow;
}
void addedge(int u,int v,int w)
{cnt++;edge[cnt].next=head[u];edge[cnt].to=v;edge[cnt].f=w;head[u]=cnt;
}
bool bfs()
{memset(depth,0,sizeof(depth));queue<int>que;while(!que.empty()){que.pop();}que.push(s);depth[s]=1;while(!que.empty()){int cur=que.front();que.pop();if(cur==t)break;for(int i=head[cur];i!=0;i=edge[i].next){listx temp=edge[i];if(depth[temp.to]==0&&temp.f>0){depth[temp.to]=depth[cur]+1;que.push(temp.to);}}} if(depth[t]==0)return false;return true;
}
int dfs(int u,int flow)
{if(u==t)return flow;for(int i=head[u];i!=0;i=edge[i].next){listx temp=edge[i];if(depth[u]+1==depth[temp.to]&&temp.f>0){flow=flow<temp.f?flow:temp.f;int newx=dfs(temp.to,flow);if(newx>0){update(i,newx);return newx;}}}return 0;
}
int main()
{int ans=0;scanf("%d%d%d%d",&n,&m,&s,&t);for(int i=1;i<=m;i++){int a1,b1,c1;scanf("%d%d%d",&a1,&b1,&c1);  addedge(a1,b1,c1);addedge(b1,a1,0);}while(bfs()){int k;while(k=dfs(s,10000000)){ans+=k;}}printf("%d",ans);return 0;
}

【网络流】EK算法及其优化相关推荐

  1. (通俗易懂小白入门)网络流最大流——EK算法

    网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定 ...

  2. 网络流之最大流算法——EK算法(通俗讲解)

    先放道模板题来说明网络流: Power Network A power network consists of nodes (power stations, consumers and dispatc ...

  3. 网络流问题以及EK算法复杂度分析

    网络流问题以及EK算法复杂度分析 一.网络流算法 通过一个例子引入网络流问题. 现有一个自来水厂要往家里通水,自来水厂用Vs表示,家用Vt表示.从自来水厂到家之间连接了很多水管,并且中途经过很多转接点 ...

  4. 利用EK算法求网络流的最大流

    [题目来源] https://www.acwing.com/problem/content/description/2173/ [问题描述] 给定一个包含 n 个点 m 条边的有向图,并给定每条边的容 ...

  5. 网络流——最大流EK算法讲解

    网络流--最大流EK算法讲解 好了,这是第二篇博客了,如第一篇所述,来讲一讲刚刚理解的网络流.因为本人只会EK算法,所以先讲这个算法.(我会去补知识点的!!!) 什么是网络流??? 读者们刚接触这个知 ...

  6. 图论 —— 网络流 —— 最大流 —— FF 算法与 EK 算法

    [概述] FF 算法与 EK 算法是求解最大流的一般增广路方法,其时间复杂度均为 O(n*m*m) Ford-Fulkerson 算法是求解最大流的最基础的算法,其核心思想是增广路定理:网络达到最大流 ...

  7. 网络流最大流----EK算法

    先来介绍一些基本概念: 网络是指一个有向图G=(V,E),有两个特殊节点:源点S和汇点T.每条有向边(x,y)都有一个权值c(x,y),称为边的容量.如果(x,y)不在图中,那么就有c(x,y)=0. ...

  8. 网络流入门——算法模板,习题和解析

    最近一段时间再搞网络流,今天终于搞完了!!!!QAQ,好累呀. 首先是关于网络流的基础知识,这部分东西有点多,就不在这里说了,给几个有用的资源. 先推荐一下建图的博客:链式向前星,静态链表和邻接矩阵建 ...

  9. 图论算法小结:网络流及其算法

    个人说明:最近学到了图论算法,但网络流这部分颇难理解,于是在网上找到了一片比较好的讲解博客.转载之~ 网络流(Network Flow) 将每条有向边想象成传输物质的管道.每个管道都有一个固定的容量, ...

最新文章

  1. APPIUM Android 定位方式
  2. 配置审计(Config)配合开启OSS防盗链功能
  3. php一些高级函数方法
  4. 一个对复用view下滑动流畅度优化,图片和内存处理,稳定性都非常强大的android开源框架(beyondPhysics)...
  5. 项目管理六大制约因素_用PCTS理念做好项目管理规划(优秀项目管理者必知)...
  6. python对图片颜色校正_使用Python PIL更改图像色调
  7. java 责任链模式 链表_责任链模式的实现及源码中应用
  8. Bootstrap 排版地址
  9. c++ gzip java.util.zip.gzip_java.util.zip.GZIPInputStream.close()方法示例
  10. 【第四章】 资源 之 4.4 Resource通配符路径 ——跟我学spring3
  11. 应用程序按照以下顺序执行由 global.asax 文件中定义的模块或用户代码处理的事件...
  12. gitee怎么仓库间传文件_薄书的Gitee 码云使用教程学习纪录 - 薄书
  13. maven依赖c3p0_springboot 使用c3p0数据库连接池的方法
  14. 7.2.5 dps 测试软件,7.2.5冰DK萨墓六大DPS饰品测试:属性机制及分析
  15. 阿里p9 Python工程师,进阶书籍推荐
  16. 翻译: Github Copilot 可以创作艺术吗?
  17. 俄罗斯方块java代码_俄罗斯方块源代码
  18. 游戏SDK(三)架构设计之代码实现1
  19. 芯片无忧的使用教程,ChipEasy芯片无忧如何检测U盘?U盘检测方法说明
  20. 构件组装-模型驱动的构件组装

热门文章

  1. hive窗口函数使用
  2. 结构体类型struct
  3. 暗刷流量,刷点击,手机访问的一些小见解
  4. PPC扑克牌游戏开发实录 第一篇 之 全屏
  5. Linux 内核 3.3 和 3.4 简介
  6. 什么是循环依赖以及解决方式
  7. 在使用angular打包项目的时候 打包老是出错 内存溢出的解决办法
  8. HDU - 4081 Qin Shi Huang's National Road System(次小生成树)
  9. 制作MacOS U盘安装盘教程
  10. 国庆,几家欢喜几家愁