1 问题描述

何为最大流量问题?

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

2 解决方案

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

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

(1)残留网络

(2)增广路径

(3)流网络的割

下图是对于最大流量问题实现的一个图,该图共有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); //源点为顶点0
for(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的前驱顶点为index
flow[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; //前向边剩余流量减少temp
capacity[end][start] += temp; //后向边剩余流量增加temp
end = 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);
}
}

运行结果:

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

Java实现最大流量问题的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  3. 算法9-5:最大流算法的Java代码

    残留网络 在介绍最大流算法之前先介绍一下什么是残留网络.残余网络的概念有点类似于集合中的补集概念. 下图是残余网络的样例. 上面的网络是原始网络.以下的网络是计算出的残留网络.残留网络的作用就是用来描 ...

  4. 服务限流-令牌桶java实现

    此文非常不错,抄自: https://www.cnblogs.com/googlemeoften/p/6020718.html 其他实现 https://www.cnblogs.com/LBSer/p ...

  5. 算法笔记_140:最小费用最大流问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在最大流有多组解时,给每条边在附上一个单位费用的量,问在满足最大流时的最小费用是多少? 2 解决方案 下面代码所使用的测试数据如下图: 具体代码如下 ...

  6. hdu 4240(最大流+最大流量的路)

    Route Redundancy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. java 服务接口API限流 Rate Limit

    一.场景描述 很多做服务接口的人或多或少的遇到这样的场景,由于业务应用系统的负载能力有限,为了防止非预期的请求对系统压力过大而拖垮业务应用系统. 也就是面对大流量时,如何进行流量控制? 服务接口的流量 ...

  8. java实现洛谷P3376【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数u ...

  9. Java实现最小费用最大流问题

    1 问题描述 在最大流有多组解时,给每条边在附上一个单位费用的量,问在满足最大流时的最小费用是多少? 2 解决方案 下面代码所使用的测试数据如下图: package com.liuzhen.pract ...

随机推荐

  1. 解决:idea中右键项目找不到subversion

    2019.02版IDEA,刚刚发现更新不了项目,但是我记得之前的项目是可以直接更新的.然后,我打开之前的项目找到相关项,对比了一下,找到了方法: file--settings--Version Con ...

  2. Python 简明教程 --- 2,第一个Python 程序

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 如果你发现特殊情况太多,那你肯定是用错方法了. -- Carig Zerouni 当你在自己的电脑上 ...

  3. 马上要去bupt参加培训了。。

    想想我一直在逃避,失败人生.傻逼废物垃圾废人...我这么弱还活在世界上,真的对不起 Model

  4. 力扣题解-面试题22. 链表中倒数第K个节点

    题目描述 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5. ...

  5. react-router 4v 路由嵌套问题

    嵌套的路由中,子级的Link跳转到父级时,页面无法整个渲染到父级. 原因:某一级的路由用了Router组件,导致内部Link的时候无法将整个页面渲染到“/” 解决方法:全局一个Router. 子级的兄 ...

  6. HTML标签和属性三

    八.列表 1.列表的作用 让数据有条理的显示,在数据之前添加标识 但是现在页面布局,经常会使用到无序列表 2.列表的组成 ①有序列表 <ol> <li></li> ...

  7. nginx配置之禁止访问和404错误功能配置

    禁止访问功能配置 nginx.conf中的http{}中的server{}的location ..{}中: location / { #拒绝访问,192.168.16.0网段的同学都无法访问 /24是 ...

  8. mysql小白系列_14 线上故障分析与排错

    1.重现故障5---线上执行update报错,并处理.(表结构和UPDATE语句自己构造,请给出详细步骤) 1)update故障出现ERROR 1206 (HY000): The total numb ...

  9. 解决删除~/Library/Caches/CocoaPods/search_index.json重新pod search还是不起作用

    今天新苹果机安装cocoapods,安装完以后发现怎么pod search 都没有用 命令行提示: swhcxp@iosdevmac ~ % pod search Almofire Setup com ...

  10. ASCII码排序(hdu2000)

    思考:字符串的输入中是不包含空格的,所以可以用scanf_s("%字符类型占位符",&变量名,整型参数)来输入字符串. 因为scanf_s()函数的输入一遇到空格就会停止输 ...