FordFulkerson算法求网络最大流(java)

FordFulkerson算法3个核心的概念:残留网络、增广路径和流网络的割(详细介绍参考算法导论)
所测试的网络结构图如图所示:

第1次遍历在残留网络中找到S->V2->V1->V3->T这条增广路径(下图A),这时的网络流量如图B

执行第2次遍历的时候在残留网络中找到S->V2->V4->T这条增广路径(下图A),这时的网络流量如图B

执行第3次遍历的时候在残留网络中找到S->V2->V4->V3->T这条增广路径(下图A),这时的网络流量如图B

执行第4次遍历的时候在残留网络中找到S->V1->V2->V4->V3->T这条增广路径(下图A),这时的网络流量如图B

执行第5次遍历的时候在残留网络中找到S->V1->V3->T这条增广路径(下图A),这时的网络流量如图B
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络流是一种图论算法,用于解决最大流问题。Java中可以使用Dinic算法或者Edmonds-Karp算法实现网络流。 Dinic算法的基本思想是通过多次增广路径来最大流,时间复杂度为O(V^2E)。Edmonds-Karp算法则是在BFS的基础上进行增广,时间复杂度为O(VE^2)。 以下是Java实现Dinic算法的示例代码: ```java import java.util.*; public class Dinic { static int N = 510, M = 100010, INF = 0x3f3f3f3f; static int n, m, S, T; static int h[] = new int[N], e[] = new int[M], f[] = new int[M], ne[] = new int[M], idx; static int d[] = new int[N], cur[] = new int[N]; static boolean st[] = new boolean[N]; public static void main(String args[]) { Scanner scan = new Scanner(System.in); n = scan.nextInt(); m = scan.nextInt(); S = 1; T = n; Arrays.fill(h, -1); while (m-- > 0) { int a = scan.nextInt(), b = scan.nextInt(), c = scan.nextInt(); add(a, b, c); } System.out.println(dinic()); } static void add(int a, int b, int c) { e[idx] = b; f[idx] = c; ne[idx] = h[a]; h[a] = idx++; e[idx] = a; f[idx] = 0; ne[idx] = h[b]; h[b] = idx++; } static boolean bfs() { Arrays.fill(d, -1); Queue<Integer> q = new LinkedList<>(); q.offer(S); d[S] = 0; cur[S] = h[S]; while (!q.isEmpty()) { int t = q.poll(); for (int i = h[t]; i != -1; i = ne[i]) { int ver = e[i]; if (d[ver] == -1 && f[i] > 0) { d[ver] = d[t] + 1; cur[ver] = h[ver]; if (ver == T) return true; q.offer(ver); } } } return false; } static int find(int u, int limit) { if (u == T) return limit; int flow = 0; for (int i = cur[u]; i != -1 && flow < limit; i = ne[i]) { cur[u] = i; int ver = e[i]; if (d[ver] == d[u] + 1 && f[i] > 0) { int t = find(ver, Math.min(f[i], limit - flow)); if (t == 0) d[ver] = -1; f[i] -= t; f[i ^ 1] += t; flow += t; } } return flow; } static int dinic() { int r = 0, flow; while (bfs()) while ((flow = find(S, INF)) != 0) r += flow; return r; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值