最大流EK和Dinic算法

最大流EK和Dinic算法

EK算法

最朴素的求最大流的算法。
做法:不停的寻找增广路,直到找不到为止

代码如下:

@Frosero
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3fusing namespace std;
int n,m;
int cap[202][202],flow[202][202],mf[202],pre[202];//cap为网络的容量 flow为现在的流量 //mf[i]为原点到点i的最大流量 pre[i]为增广路上i点上一个点int EK(int s,int t){memset(flow,0,sizeof(flow));queue<int>q;int ans = 0;while(1){while(!q.empty()) q.pop(); q.push(s);memset(mf,0,sizeof(mf));mf[1] = INF;while(!q.empty()){int u = q.front(); q.pop();for(int i=1;i<=m;i++)if(!mf[i] && flow[u][i] < cap[u][i]){pre[i] = u;q.push(i);mf[i] = min(mf[u],cap[u][i] - flow[u][i]);}}if(mf[t] == 0) break;ans += mf[t];for(int i=t;i!=s;i=pre[i]){flow[pre[i]][i] += mf[t];flow[i][pre[i]] -= mf[t];}}return ans;
}int main(){while(scanf("%d %d",&n,&m)!=EOF){memset(cap,0,sizeof(cap));memset(flow,0,sizeof(flow));int u,v,w;while(n--){scanf("%d %d %d",&u,&v,&w);cap[u][v] += w;}printf("%d\n",EK(1,m));}
}

Dinic算法

Dinic的优化部分就是给残留网络生成一个层次图,然后尽量的利用层次图后再形成新的层次图。

理论上Dinic和EK算法的时间复杂度差不多,但是事实上Dinic算法要好得多。

代码如下:

@Frosero
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3fusing namespace std;int n,m,flow[202][202],cap[202][202];
int dis[202];//flow为现在的流量 cap为网络的容量//dis为点的层次bool bfs(){                 //形成层次图memset(dis,-1,sizeof(dis));dis[1] = 0;queue<int>q; q.push(1);while(!q.empty()){int u = q.front(); q.pop();for(int i=1;i<=m;i++)if(dis[i] == -1 && flow[u][i] < cap[u][i]){dis[i] = dis[u] + 1;q.push(i);}}if(dis[m] == -1) return false;else return true;
}int dfs(int s = 1,int f = INF){     //利用层次图不断寻找增广路if(s == m || f == 0) return f;int ans = 0;for(int i=1;i<=m;i++)if(dis[i] == dis[s] + 1){int a = dfs(i,min(f,cap[s][i] - flow[s][i]));if(a == 0) continue;flow[s][i] += a;flow[i][s] -= a;ans += a;f -= a;if(f <= 0) break;}return ans;
}int dinic(){                //Dinic主过程int ans = 0;while(bfs()){ans += dfs();}return ans;
}int main(){while(scanf("%d %d",&n,&m)!=EOF){   //本代码假设1为原点 m为汇点memset(flow,0,sizeof(flow));memset(cap,0,sizeof(cap));int u,v,w;while(n--){scanf("%d %d %d",&u,&v,&w);cap[u][v] += w;}printf("%d\n",dinic());}return 0;
}

转载于:https://www.cnblogs.com/ScratchingBear/p/5345837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

某大厂JVM常见面试题(二)吐血整理

什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机…

_stat64获取错误_Log4j,Stat4j,SMTPAppender集成–汇总错误日志以发送过多电子邮件...

_stat64获取错误我们的开发团队希望在生产系统出现问题时尽快得到通知&#xff0c;这是一个每天为成千上万的客户提供服务的关键Java Web应用程序。 想法是让它在出现太多错误时向我们发送电子邮件&#xff0c;这些错误通常表示数据库&#xff0c;外部Web服务有问题&#xff0c…

Kali2021修改更新源

本次演示三种环境更换更新源 Xfce4版本 KDE版本 命令行版本 更新源 #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

java面试中jvm执行子系统详细分析(三)

什么是jvm? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机…

java中菜单分几级_JavaWeb三级菜单分类查询详解

废话不多说&#xff0c;直接贴代码&#xff1a;dao层代码&#xff1a;mapper&#xff1a;ListselectByParentId(Integer id);mapper.xmlselectfrom easybuy_product_categorywhere parentId #{parentId,jdbcTypeINTEGER}Test:import cn.hd.entity.ProductCategory;import cn.h…

使用Javaslang进行Java 8中的函数式编程

我们非常高兴地在jOOQ博客上宣布一个客座帖子&#xff0c;该帖子由HSH Nordbank的高级软件工程师&#xff0c;三个孩子的父亲&#xff0c; Daniel Dietrich撰写。 他目前作为项目负责人和首席开发人员为金融产品创建定价框架。 除工作外&#xff0c;他还对编程语言&#xff0c…

HFS远程命令执行漏洞复现

漏洞程序下载地址:Http File Server 这里说一下&#xff0c;在Windows server 2003中复现时&#xff0c;我直接使用Administrator用户登录&#xff0c;然后复现&#xff0c;未出现权限问题。再Windows 10中尝试复现时发现权限不足&#xff0c;需要以管理员权限执行漏洞程序。 运…

HTML标签速查表

有时候,学习的前端的标签太多,容易记不牢,这里整理一份标签速查表,便于查阅。不区分html或html5.

Silverlight 中datagrid控件-- 通过设置数据虚拟化加速显示

定义依赖属性作为datagrid的数据源 protected static readonly DependencyProperty ViewLogsProperty DependencyProperty.Register("ViewLogs", typeof(ObservableCollection<RMSReportEvent>), typeof(LogViewer), new PropertyMetadata(null)); protected …

java解析java源码_JAVA语言-Java源码解析-Stack源码分析

一、简介stack类图.png栈是数据结构中一种很重要的数据结构类型&#xff0c;因为栈的后进先出功能是实际的开发中有很多的应用场景。Java API中提供了栈(Stacck)的实现。Stack类继承了Vector类&#xff0c;而Vector类继承了AbstractList抽象类&#xff0c;实现了List类&#xf…

渗透测试神器CS(4.0)的使用

CS CS简介CS功能安装CSCS的基本使用深入标题介绍 Beacon Commands基础操作演示 CS简介 CS 是Cobalt Strike的简称&#xff0c;是一款渗透测试神器&#xff0c;常被业界人称为CS神器。Cobalt Strike已经不再使用MSF而是作为单独的平台使用&#xff0c;它分为客户端与服务端&…

UTF-8和GBK有啥区别?

粉丝求助: 如何解决: 把编辑器和浏览器的字符集统一设置成utf-8或者gbk即可。 主要区别: 1.GBK是在bai国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不du是国家标准)。zhiGBK编码dao专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。 2. UTF-8 编码是…

服务osgi_OSGi –具有服务的简单Hello World

服务osgi在本文中&#xff0c;我们将使用OSGi开发一个简单的Hello World应用程序。 我们将使用Felix作为OSGi容器 。 在下一篇文章中&#xff0c;我们将继续使用该应用程序&#xff0c;并使用Spring Dynamic Modules对其进行改进。 为了使开发有趣&#xff0c;我们将创建两个捆…

Java反射(Reflection)

基本概念 在Java运行时环境中&#xff0c;对于任意一个类&#xff0c;能否知道这个类有哪些属性和方法&#xff1f;对于任意一个对象&#xff0c;能否调用它的任意一个方法&#xff1f; 答案是肯定的。 这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射&…

超详细的MySQL三万字总结

文章目录 MySQL基础数据库的介绍数据库概述数据的存储方式数据库的概念常见数据库排行榜 数据库的安装与卸载数据库的安装数据库的卸载 数据库服务的启动与登录Windows 服务方式启动DOS 命令方式启动控制台连接数据库SQLyog 图形化工具——客户端使用 SQLyog 登录数据库数据库…

map转字符串数组中 php_js将map转换成数组

linux中oops信息的调试及栈回溯【转】本文转载自:http://blog.csdn.net/kangear/article/details/8217329 ...linux 2&period;6 驱动笔记(一)本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6…

你要的能做出炫酷图表的网站来啦

不需要多高深的技术&#xff0c;也不需要多长时间&#xff0c;分分钟让小白都能做出超好看的图表~ 1.DataV DataV 是阿里云出品的在线可视化工具&#xff0c;可以将超多数据&#xff0c;放在一块大屏上 2.网易有数 网易有数的特点是&#xff0c;编辑页面自由度非常高&#x…

ecshop获取客户端操作系统

<?php /*** 获得客户端的操作系统** access private* return void*/ function get_os() {if (empty($_SERVER[HTTP_USER_AGENT])){return Unknown;}$agent strtolower($_SERVER[HTTP_USER_AGENT]);$os ;if (strpos($agent, win) ! false){if (strpos($agent, nt 5.1…

求有向图中两点最短距离java_算法题解:求有向图中的最短路径(JAVA+DFS算法实现)...

求有向图中的最短路径(JAVADFS算法实现)问题描述给定一个有向图&#xff0c;如下图所示&#xff0c;求从1号顶点到5号顶点的最短路径。输入数据格式为第一行输入顶点数和边数&#xff0c;从第二行开始每一行输入3个整数&#xff0c;分别代表连接顶点的边和权重。例如&#xff1…

B站学习资源汇总

一个B站就足够解决绝大多数学习问题。 AI入门 1、Crash Course AI https://space.bilibili.com/276373762/channel/detail?cid=101907 课程介绍:该课程出自Crash Course,首发YouTube,单个视频时长均在10分钟左右。视频节奏非常好,语速偏快,适合下饭时间入门了解。主讲…