热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

最大流-dinic算法

dinic与EK算法的比较:1、使用了层次网络,减小了寻找增广路的代价。2、允许一次dfs多次增广,一次dfs可以把本层级网络的所有增广路都找出来。学习

dinic与EK算法的比较:

1、使用了层次网络,减小了寻找增广路的代价。

2、允许一次dfs多次增广,一次dfs可以把本层级网络的所有增广路都找出来。

学习EK算法请转到 最大流-EK(Edmond—Karp)算法


算法步骤:

(1)构建残余网络。

(2)构建层次网络。即初始化距离标号level。距离标号是指定点距离源点边数的最小值。

(3)dfs多路增广。这里找到一条增广路之后,一直回退直到一个顶点v扣除增广流量后还有残余流量,沿途更新边的 残余容量。注意到第一次返回到v时,v之前的边的容量并没有更新。直到从v点出发的所有增广路都找完了,才会向前返回并更新边的容量,这时更新值为从v点出发的所有增广路的总流量。相当于将流量积攒下来一起扣除。

(4)重复步骤(2)(3)。


题目链接:Drainage Ditches

自己整了一份比较简洁的模板

#include
#include
#include
#include
using namespace std;
#define inf 1<<29
int n,m;
int G[205][205];//残余网络
int level[205];//层级网络,各点的层级
int bfs(int s,int t)//构建层级网络
{
memset(level,0,sizeof level);
level[s]=1;
queue q;
q.push(s);
while(!q.empty())
{
int top=q.front(); q.pop();
for(int i=1;i<=n;i++)
if(!level[i] && G[top][i])//如果这个点没有被搜过,并且top->i这条边的残余容量大于0
{
level[i]=level[top]+1;//将这个点的层级赋为上个点层级+1
q.push(i);//将这个点入队
}
}
return level[t];//如果本层级网络能够到达终点
}
int dfs(int v,int t,int flow)//v为当前结点,t为终点,flow为v点存留的流量
{
int s=flow,increase;//s记录源点的流量,也就是INF,increase为本条增广路的流量
if(v==t) return flow;//如果搜到了终点,则返回flow,此时flow=increase
for(int i=1;i<=n;i++)
{
if(G[v][i] && level[i]==level[v]+1)//如果v->i这条边残余容量>0,并且i为v的下一个层级
{
increase=dfs(i,t,min(flow,G[v][i]));
G[v][i]-=increase;//更新残余网络
G[i][v]+=increase;
flow-=increase;//v点的残余容量减去增广消耗的流量
}
}
return s-flow;//源点原容量(inf)-源点剩余容量(flow)=本层次网络增广的总流量
}
int dinic(int s,int t)
{
int maxflow=0,f;
while(bfs(s,t)) maxflow+=dfs(s,t,inf);//每次尝试构建层次网络,如果构建成功,maxflow加上本网络增广总流量
return maxflow;
}
int main()
{
while(~scanf("%d%d",&m,&n))
{
memset(G,0,sizeof G);
int ui,vi,wi;
for(int i=0;i {
scanf("%d%d%d",&ui,&vi,&wi);
G[ui][vi]+=wi;
}
printf("%d\n",dinic(1,n));
}
return 0;
}



推荐阅读
  • 如何使用 CleanMyMac X 2023 激活码解锁完整功能
    本文详细介绍了如何使用 CleanMyMac X 2023 激活码解锁软件的全部功能,并提供了一些优化和清理 Mac 系统的专业建议。 ... [详细]
  • 解决MacOS上Android Studio Gradle版本不匹配问题
    在MacOS系统中,升级Android Studio后可能会遇到Gradle版本不兼容的问题。当网络下载更新受阻时,可以使用本地已安装的Gradle版本来解决问题。本文将详细介绍如何配置本地Gradle环境以确保开发工作的顺利进行。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 智能投顾机器人:创业者如何应对新挑战?
    随着智能投顾技术在二级市场的兴起,针对一级市场的智能投顾也逐渐崭露头角。近日,一款名为阿尔妮塔的人工智能创投机器人正式发布,它将如何改变投资人的工作方式和创业者的融资策略? ... [详细]
  • 投资是一场长期的博弈,需要耐心和策略。每个人的投资决策都基于自身的经历和判断,他人的建议仅供参考,最终的选择应由自己权衡。本文将从基本面和技术面两方面对当前的数字货币市场进行分析,并提供相应的操作建议。 ... [详细]
  • 深入探讨Web页面中的锚点交互设计
    本文旨在分享Web前端开发中关于网页锚点效果的实现与优化技巧。随着Web技术的发展,越来越多的企业开始重视前端开发的质量和用户体验,而锚点功能作为提升用户浏览体验的重要手段之一,值得深入研究。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文档介绍了如何在Visual Studio 2010环境下,利用C#语言连接SQL Server 2008数据库,并实现基本的数据操作,如增删改查等功能。通过构建一个面向对象的数据库工具类,简化了数据库操作流程。 ... [详细]
  • 牛顿类算法解析与应用
    本文详细介绍了牛顿类算法的基本原理、应用场景及其在优化问题中的重要性,旨在为读者提供全面的理解和实际操作的指导。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 本题要求判断给定的二叉树是否为镜像对称。通过递归和迭代两种方法,可以有效地解决这一问题。例如,二叉树 [1,2,2,3,4,4,3] 是对称的,而 [1,2,2,null,3,null,3] 则不是。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本篇文章介绍如何使用Python编写一个程序,用于判断用户输入的变量名是否符合Python的命名规则。程序通过检查首字符和后续字符的合法性,确保变量名符合标准。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 云屏系统基于嵌入式微系统msOS,旨在解决当前嵌入式彩屏GUI编程中硬件要求高、软件开发复杂、界面效果不佳等问题。该系统通过结合MCU和Android技术,利用Html5+JavaScript实现高效、易用的图形用户界面开发,使嵌入式开发人员能够专注于业务逻辑。 ... [详细]
author-avatar
多米音乐_34429718
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有