目录

1 问题描述

2 解决方案

 


1 问题描述

何为最大流量问题?

给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点n能够接收的最大流量。图中每条边的权值为该边的容量,从顶点0到顶点n的某一条路径中最大流量不能超过该路径中任何一条边剩下的容量。


2 解决方案

上述对于最大流量问题的描述是楼主自己个人描述,描述的有点粗暴简略>~<。

求取最大流量问题的的核心要理解三个概念:

(1)残留网络

(2)增广路径

(3)流网络的割

具体概念讲解,请见文末参考资料1。

下图是对于最大流量问题实现的一个图,该图共有7条有向边,从顶点1到顶点6的最大流量为3。

具体代码如下:

package com.liuzhen.practice;import java.util.ArrayList;
import java.util.Scanner;public class Main {public static int maxV = Integer.MAX_VALUE;public static int[][] capacity = new int[6][6]; //用于统计给定图前向边和后向边剩余流量public static int[] flow = new int[6];  //用于统计从源点到图中任意一点i的最大可增加的流量public static int[] pre = new int[6];  //用于记录当前到达顶点的前驱顶点public int bfs(int[][] graph) {  //使用BFS遍历,寻找给定图的增广路径ArrayList<Integer> list = new ArrayList<Integer>();list.add(0);      //源点为顶点0for(int i = 0;i < 6;i++) {pre[i] = -1;   //初始化所有顶点的前驱顶点为-1
        }pre[0] = 0;     //源点的前驱顶点设定为自己flow[0] = maxV; //源点的前驱顶点到源点的增加流量设定为无穷大while(!list.isEmpty()) {int index = list.get(0);list.remove(0);if(index == 5)break;for(int i = 0;i < graph.length;i++) {if(capacity[index][i] > 0 && pre[i] == -1) {//当顶点i未被访问且到达顶点i有剩余流量时pre[i] = index;  //顶点i的前驱顶点为indexflow[i] = Math.min(flow[index], capacity[index][i]);list.add(i);}}}if(pre[5] != -1)return flow[5];return -1;}public void getResult(int[][] graph) {int result = 0;int temp = bfs(graph);while(temp != -1) {result = result + temp;int start = pre[5];int end = 5;while(start != 0) {capacity[start][end] -= temp;   //前向边剩余流量减少tempcapacity[end][start] += temp;   //后向边剩余流量增加tempend = start;start = pre[end];}capacity[0][end] -= temp;capacity[end][0] += temp;temp = bfs(graph);}System.out.println("给定图的最大流量为:"+result);return;}public static void main(String[] args) {Main test = new Main();int[][] graph = new int[6][6];Scanner in = new Scanner(System.in);int num = in.nextInt();   // 给定图的边数目for(int i = 0;i < num;i++) {int a = in.nextInt();int b = in.nextInt();int value = in.nextInt();graph[a - 1][b - 1] = value;capacity[a - 1][b - 1] = value;//前向边起始剩余流量为边的容量,后向边起始剩余流量为0
        }test.getResult(graph);}
}

运行结果:

7
1 2 2
1 3 4
2 5 3
2 3 5
4 3 1
5 6 4
3 2 6
给定图的最大流量为:3

参考资料:

1. 图的匹配问题与最大流问题(二)——最大流问题Ford-Fulkerson方法

2.关于最大流的EdmondsKarp算法详解

3.《算法设计与分析基础》第3版   Anany Levitin 著   潘彦 译

转载于:https://www.cnblogs.com/liuzhen1995/p/6727372.html

算法笔记_132:最大流量问题(Java)相关推荐

  1. 算法笔记_010:插入排序(Java)

    1 问题描述 给定一组数据,使用插入排序得到这组数据的非降序排列. 2 解决方案 2.1 插入排序原理简介 引用自百度百科: 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求 ...

  2. java 寻找和为定值的多个数_算法笔记_037:寻找和为定值的两个数(Java)

    1 问题描述 输入一个整数数组和一个整数,在数组中查找两个数,满足他们的和正好是输入的那个整数.如果有多对数的和等于输入的整数,输出任意一对即可.例如,如果输入数组[1,2,4,5,7,11,15]和 ...

  3. 金蝉素数c语言,算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)

    前言:以下代码仅供参考,若有错误欢迎指正哦~ 1好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学.习".但 ...

  4. java 完全背包问题算法_算法笔记(c++)--完全背包问题

    算法笔记(c++)--完全背包和多重背包问题 完全背包 完全背包不同于01背包-完全背包里面的东西数量无限 假设现在有5种物品重量为5,4,3,2,1 价值为1,2,3,4,5 背包容量为10 #in ...

  5. 《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  6. 【算法】《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  7. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

  8. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  9. 函数传参数_算法笔记(7)第二章C、C++快速入门函数,main函数,

    #includevoid change(int x){ x=x+1;}int main(){ int x=10; change(x); prinf("%d\n",x); retur ...

最新文章

  1. [转]mysql性能的检查和调优方法
  2. 第十六届智能车竞赛开源云台设计
  3. aix java home_在AIX环境下安装IBM JDK 1.6的教程
  4. Leetcode 33.搜索旋转排序数组 (每日一题 20210707)
  5. MATLAB常用数学函数
  6. 四年级上册数学计算机笔记,四年级数学下册笔记整理
  7. java executor spring_Spring+TaskExecutor实例
  8. Java代码的编译与反编译那些事儿
  9. JAVA王思聪吃热狗程序_王思聪吃热狗什么梗?
  10. openGL ES进阶教程(六)美颜滤镜之美白,磨皮,红润
  11. 基于粒子群算法的PID控制器优化设计
  12. 阿里云域名绑定IP手把手教学
  13. 怎么在计算机登录VMware,vmware虚拟机怎么用,vmware虚拟机的使用方法
  14. IDEA改变背景颜色(护眼色)
  15. 在64位Windows的VS软件中使用C/C++调用gnuplot画图
  16. 六、图(上):六度空间
  17. snowboy进行语音唤醒,编译snowboy文件
  18. Vue3+TS 中使用Provide/Inject 的例子
  19. 2022年湖北省大数据产业发展规划
  20. 计算机毕设(附源码)JAVA-SSM建筑工地环保监控系统研究

热门文章

  1. 幅度调制(AM调制、DSB(双边带)调制、SSB、VSB)
  2. java8的日期API总结(JSR310)
  3. 正则表达式【第二卷】
  4. bzoj1232[Usaco2008Nov]安慰奶牛cheer*
  5. puppet3.5源码包安装和配置
  6. 加速你的Hibernate引擎(下)
  7. 发布npm包到GitHub Packages
  8. mysql修改字段一部份_mysql 修改字段中部分值
  9. SpringMVC 另一种基于xml的处理器、适配器(了解)
  10. Web 阶段梳理(2019.1.9)