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. 聊聊 TypeScript 中的类型保护

    聊聊 TypeScript 中的类型保护 在 TypeScript 中使用联合类型时,往往会碰到这种尴尬的情况: interface Bird { // 独有方法 fly(); // 共有方法 lay ...

  2. A~Z;26个字母美式

    26个字母美式读法 音频下载地址: 链接:https://pan.baidu.com/s/1KOlxNCydgtsODQZMT9JFJg 提取码:8a9g

  3. 暴力破解-HTTP Basic认证

    0x01 HTTP Basic认证介绍 基本认证 basic authentication ← HTTP1.0提出的认证方法 基本认证步骤: 1. 客户端访问一个受http基本认证保护的资源. 2. ...

  4. 【SMB源码解析系列】——001.JumpEngine函数

    在SMB的源码中大概有不到20处看起来很奇怪的指令,它的格式是通过jsr指令调用一个名为JumpEngine的函数,其后并不是跟随某些后续的逻辑指令,而是通过.dw定义了一系列16位地址. 我们可以看 ...

  5. js 延迟加载的几种方法

    1. defer 属性HTML 4.01 为 <script>标签定义了 defer属性. 用途:表明脚本在执行时不会影响页面的构造.也就是说,脚本会被延迟到整个页面都解析完毕之后再执行. ...

  6. 【漫画】CAS原理分析!无锁原子类也能解决并发问题!

    本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...

  7. CDH6 高版本hbase+solr实现二级索引

    之前的环境是单独下载的CDH组件包搭建的集群,但是因为hadoop版本过低导致漏洞无法修复,重新搭建高版本集群环境. 新集群环境: 主要组件:hadoop,hbase,zookeeper,Key-Va ...

  8. D. Almost Acyclic Graph 判断减一条边能不能得到DAG

    D. Almost Acyclic Graph time limit per test 1 second memory limit per test 256 megabytes input stand ...

  9. C语言合法标识符(hud2024)

    输入方式:先输入一个整型,再循环输入带空格的字符串. 思考:整型用scanf_s()输入.大循环输入字符串前用getchar()函数读取缓冲区的字符.然后,输入带空格的字符串就要用”gets_s()“ ...

  10. An easy problem(hdu2055)

    输入格式:一个整型,然后循环输入一个字符加一个整型. 思考:首先用scanf_s()函数输入整型.然后一个大循环,用scanf_s()函数同时输入字符和整型.第一个scanf_s()函数后,后面还要输 ...