力扣刷题之旅:高阶篇(五)—— 网络流算法:最大流与最小割

          力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。    

--点击进入刷题地址 


引言

        在算法领域中,网络流算法是一个重要且实用的工具,尤其在处理资源分配、运输优化等问题上表现出色。最大流和最小割是网络流算法中的两个核心概念,它们在很多实际应用中都有着广泛的使用。

一、最大流与最小割的基本概念

        在一个有向图中,如果存在一个源点s和一个汇点t,以及每条边上都有一个非负容量限制,那么这样的图就被称为一个流网络。最大流问题是在这样的流网络中寻找从源点s到汇点t可以传输的最大流量。而最小割问题则是寻找一个割集,使得割集中所有边的容量之和最小,同时确保源点s汇点t在不同的子图中。

二、力扣上的题目

题目描述:最大流Maximum Flow

        给定一个有向图,其中每个节点表示一个地点,每条边表示两个地点之间的连接,边上的权重表示该连接的容量。请找出从源点s到汇点t的最大流量。

输入格式
  • 第一行包含四个整数n、m、s、t,分别表示节点的数量、边的数量、源点和汇点。
  • 接下来m行,每行包含三个整数u、v、c,表示从节点u到节点v有一条容量为c的边。
输出格式
  • 输出一个整数,表示从源点s到汇点t的最大流量。
示例
输入
4 4 1 4  
1 2 1  
2 3 2  
3 4 2  
1 4 1
输出: 
2
解释

        上述输入表示一个有向图,其中节点1是源点,节点4是汇点。从节点1到节点4的最大流量为2,可以通过两条路径实现:1→2→3→4和1→4。

三、解题代码

以下是使用Edmonds-Karp算法解决最大流问题的Python代码示例:
from queue import Queue  def edmonds_karp(graph, source, sink):  # 初始化剩余容量和流量  residual_graph = {u: {v: c for v, c in graph[u].items()} for u in graph}  flow = {u: 0 for u in graph}  # BFS寻找增广路径  def bfs():  visited = {u: False for u in graph}  parent = {u: None for u in graph}  path_flow = {u: 0 for u in graph}  queue = Queue()  queue.put(source)  visited[source] = True  path_flow[source] = float('inf')  while not queue.empty():  u = queue.get()  for v, c in residual_graph[u].items():  if c > 0 and not visited[v]:  visited[v] = True  parent[v] = u  path_flow[v] = min(path_flow[u], c)  if v == sink:  return parent, path_flow  queue.put(v)  return None, None  # 更新流量和剩余容量  def update_flow(parent, path_flow):  u = sink  while u != source:  v = parent[u]  residual_graph[v][u] += path_flow[sink]  residual_graph[u][v] -= path_flow[sink]  flow[v] += path_flow[sink]  u = v  # 主循环  while True:  parent, path_flow = bfs()  if parent is None:  break  update_flow(parent, path_flow)  return flow[sink]  # 示例输入与输出  
if __name__ == "__main__":  n, m, source, sink = map(int, input().split())  graph = {u: {} for u in range(1, n+1)}  for _ in range(m):  u, v, c = map(int, input().split())  graph[u][v] = c  print(edmonds_karp(graph, source, sink))

四、算法分析

        Edmonds-Karp算法是基于增广路径的最大流算法。它使用BFS来寻找从源点到汇点的增广路径,并沿着该路径更新流量和剩余容量。算法的时间复杂度为O(V*E^2),其中V是节点的数量,E是边的数量。虽然这个算法不是最高效的,但它的实现相对简单,适合用于理解最大流问题的基本概念。


五、总结

        通过解决最大流问题,我们学习了网络流算法中的基本概念和算法实现。最大流算法在多个领域都有广泛的应用,可以帮助我们优化资源分配和运输路线。在力扣上刷题的过程中,我们不仅提高了自己的编程能力,还深入理解了网络流算法的原理和应用。

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

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

相关文章

Python使用kruskal算法实现最小生成树

假如有多台计算机组成的局域网,不同计算机之间是使用光纤来连接的,如果把计算机看成是一个简单的节点,连接计算机的光纤看成是一条边,那这个局域网就可以抽象成为一个无向图: 添加图片注释,不超过 140 字(可选) 而对于这个图中的每个圆圈代表的是一个计算机,直线代表…

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征 1 局部特征的任务牵引:全景拼接 ①提取特征 ②匹配特征 ③拼接图像 我们希望特征有什么特性? ①可重复性 ②显著性 ③计算效率和表达紧凑性 ④局部性 2 特征点检测的任务 3 角点 在角点&#…

Python爬虫之Ajax数据爬取基本原理

前言 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样:在浏览器中可以看到正常显示的页面数据,但是使用 requests 得到的结果并没有。这是因为 requests 获取的都是原始的 HTML 文档,而浏览器中…

Kafka 之生产者(Producer)

目录 一. 前言 二. 生产消息 三. 幂等和事务 四. send() 发送消息 五. 原理解析 一. 前言 Kafka生产者是一个应用程序,它负责向 Kafka 主题发送消息。这些消息可以用于多种目的,如记录用户活动、收集物联网设备数据、保存日志消息或缓存即将写入数据…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;为了怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去…

java微服务面试篇

目录 目录 SpringCloud Spring Cloud 的5大组件 服务注册 Eureka Nacos Eureka和Nacos的对比 负载均衡 负载均衡流程 Ribbon负载均衡策略 自定义负载均衡策略 熔断、降级 服务雪崩 服务降级 服务熔断 服务监控 为什么需要监控 服务监控的组件 skywalking 业务…

Linux基础I/O(三)——缓冲区和文件系统

文章目录 什么是C语言的缓冲区理解文件系统理解软硬链接 什么是C语言的缓冲区 C语言的缓冲区其实就是一部分内存 那么它的作用是什么&#xff1f; 下面有一个例子&#xff1a; 你在陕西&#xff0c;你远在山东的同学要过生日了&#xff0c;你打算送给他一份生日礼物。你有两种方…

C++ //练习 5.24 修改你的程序,使得当第二个数是0时抛出异常。先不要设定catch子句,运行程序并真的为除数输入0,看看会发生什么?

C Primer&#xff08;第5版&#xff09; 练习 5.24 练习 5.24 修改你的程序&#xff0c;使得当第二个数是0时抛出异常。先不要设定catch子句&#xff0c;运行程序并真的为除数输入0&#xff0c;看看会发生什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器…

使用 devc++ 开发 easyx 实现 Direct2D 交互

代码为 codebus 另一先生的 文案 EasyX 的三种绘图抗锯齿方法 - CodeBus 这里移植到 devc 移植操作如下&#xff1a; 调用dev 的链接库方式&#xff1a; project -> project option -> 如图所示 稍作修改的代码。 #include <graphics.h> #include <d2d1.…

springboot175图书管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Java实现教学资源共享平台 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

算法村目录

大家好我是苏麟 , 这是算法村使用目录 . 算法通关村 从链表到动态规划的实战 目录 算法村开篇第一关 了解链表第二关 链表专题第三关 数组专题第四关 栈专题第五关 队列专题第六关 树专题第七关 二叉树遍历专题第八关 二叉树专题第九关 二分查找与二叉树专题第十关 快速排序与归…