(最大流-最小割定理也行)

https://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/07NetworkFlowI.pdf

定义大概就这些

Def. The bottleneck capacity of an augmenting path P is the minimum residual capacity of any edge in P

搬运别人的代码

``````// Copyright srcmake 2018.
// C++ Example Ford Fulkerson Algorithm

/* Ford Fulkerson Algorithm:
// 0. Initialize an adjacency matrix to represent our graph.
// 1. Create the residual graph. (Same as the original graph.)
// 2. Create an default parent vector for BFS to store the augmenting path.
// 3. Keep calling BFS to check for an augmenting path (from the source to the sink...
// 4. Find the max flow through the path we found.
// 5. Update the residual capacities of the edges and reverse edges.
// 6. Add this path's flow to our total max flow so far.
*/

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

//////////////////////////////////////////////////////////////////////////////////////////////
{

const int n = 6;

// Initialize our matrix to all 0s.
for(int i = 0; i < n; i++)
{
vector<int> row;
for(int j = 0; j < n; j++)
{
}
}

// First number is the vertex, second is the edge capacity.

// Our graph is now represented as an adjacency list.
}
//////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
// A special BFS version that returns true if there's a path from source to sink.
bool BFS(vector< vector<int> > &resAdjMatrix, int &source, int &sink, vector<int> &parent)
{
// Create an array for all nodes we visited. Initialized to false.
bool visited[n] = { false };

// Create a queue to check each node.
queue<int> q;

// Push our source into the queue and mark it as visited. It has no parent.
q.push(source);
visited[source] = true;
parent[source] = -1;

// Keep visiting vertices.
while(q.empty() == false)
{
int u = q.front();
q.pop();

// Check all of u's friends.
for(int i = 0; i < n; i++)
{
int v = i;

// We find a neighbor that hasn't been visited, and the capacity is bigger than 0.
if(visited[v] == false && capacity > 0)
{
// Push the neighbor onto the queue, mark it's parent, and mark it as visited.
q.push(v);
parent[v] = u;
visited[v] = true;
}
}
}

// If the sink got visited, then we found a path to it.
if(visited[sink] == true)
{ return true; }

return false;
}
//////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
// Use the Ford Fulkerson algorithm. Return the max flow.
int FordFulkerson(vector< vector<int> > &adjMatrix, int &source, int &sink)
{
int maxflow = 0;

// 1. Create the residual graph. (Same as the original graph.)
for(int i = 0; i < n; i++)
{
vector<int> row;
for(int j = 0; j < adjMatrix[i].size(); j++)
{
}
}

// 2. Create an empty parent array for BFS to store the augmenting path.
vector<int> parent;
for(int i = 0; i < n; i++)
{
parent.push_back(-1);
}

// 3. Keep calling BFS to check for an augmenting path (from the source to the sink...
while(BFS(resAdjMatrix, source, sink, parent) == true)
{
// 4. Find the max flow through the path we just found.
int pathflow = 10000007;

// Go through the path we just found. Iterate through the path.
int v = sink;
while(v != source)
{
int u = parent[v]; // The parent.

// Update the pathflow to this capacity if it's smaller
pathflow = min(pathflow, capacity);

// Setup for the next edge in the path.
v = u;
}

// 5. Update the residual capacities of the edges and reverse edges.
v = sink;
while(v != source)
{
int u = parent[v]; // The parent.

// Update the capacities.

// Setup for the next edge in the path.
v = u;
}

// 6. Add this path's flow to our total max flow so far.
maxflow += pathflow;
}

return maxflow;
}
//////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
cout << "Program started.\n";

// Call FordFulkerson to get the max flow from the source to the sink.
int source = 0;
int sink = 6;

for(int i = 0; i < 6; i++)
{
for(int j = 0; j < 6; j++)
{
int source = i;
int sink = j;

if(i == j) { continue; }

cout << "The max flow from " << source << " to " << sink << " is: ";
cout << FordFulkerson(adjMatrix, source, sink) << endl;
}
cout << endl;
}

cout << "Program ended.\n";

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
``````

手撕Ford-Fulkerson algorithm 学一半的笔记的更多相关文章

1. ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)

第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...

2. NN入门，手把手教你用Numpy手撕NN(一)

前言 这是一篇包含极少数学推导的NN入门文章 大概从今年4月份起就想着学一学NN,但是无奈平时时间不多,而且空闲时间都拿去做比赛或是看动漫去了,所以一拖再拖,直到这8月份才正式开始NN的学习. 这篇文 ...

3. NN入门，手把手教你用Numpy手撕NN(2)

这是一篇包含较少数学推导的NN入门文章 上篇文章中简单介绍了如何手撕一个NN,但其中仍有可以改进的地方,将在这篇文章中进行完善. 误差反向传播 之前的NN计算梯度是利用数值微分法,虽容易实现,但是计算 ...

4. NN入门，手把手教你用Numpy手撕NN(三)

NN入门,手把手教你用Numpy手撕NN(3) 这是一篇包含极少数学的CNN入门文章 上篇文章中简单介绍了NN的反向传播,并利用反向传播实现了一个简单的NN,在这篇文章中将介绍一下CNN. CNN C ...

5. 编译原理--05 用C++手撕PL/0

前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...

6. 优雅手撕bind函数(面试官常问)

优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...

7. 手撕spring核心源码，彻底搞懂spring流程

引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...

8. Netty实现高性能IOT服务器(Groza)之手撕MQTT协议篇上

前言 诞生及优势 MQTT由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,现为Cirrus Link)于1999年开发,用于监测穿越沙漠的石油管道.目标 ...

9. 手撕RPC框架

手撕RPC 使用Netty+Zookeeper+Spring实现简易的RPC框架.阅读本文需要有一些Netty使用基础. 服务信息在网络传输,需要讲服务类进行序列化,服务端使用Spring作为容器.服 ...

10. 手撕公司SSO登陆原理

Single Sign-on SSO是老生常谈的话题了,但部分同学对SSO可能掌握的也是云里雾里,一知半解.本次手撕公司的SSO登陆原理,试图以一种简单,流畅的形式为你提供 有用的SSO登陆原理. 按 ...

随机推荐

package com.xx.xx.config; import java.util.concurrent.ThreadPoolExecutor; import org.slf4j.Logger; i ...

2. 小凡的Python之路——启航

小凡,经过自己的努力考上了一所普通的二本大学.高考填写志愿的时候,根本不知道选择什么专业,稀里糊涂的被调剂到"应用统计学". 老师和同学都说,现在是大数据时代,数据分析现在是热门岗 ...

3. 【BOOK】解析库--pyquery

CSS选择器 1.初始化 html=''' <div> <ul> <li class="item-0">first item</li> ...

4. 某星球存在两种生物，A种生物有1个头6条腿，B种生物有3个头4条腿。来自地球的太空船刚刚在该星球降落， 突然发现一大群这两种生物组成的队伍，由于时间紧，只数了头的数量和腿的数量，请帮助宇航员分析A、B两种生物各有多少个。

package competition;import java.util.Scanner;/*        某星球存在两种生物,A种生物有1个头6条腿,B种生物有3个头4条腿.来自地球的太空船刚刚在 ...

5. element UI 选择时间点（可选择某一个或者多个时间点）

html代码如下: <el-date-picker ref="datesRef" type="dates" v-model="searchObj ...

6. Python-pytest -> 在自动化测试中，如何切换不同的测试环境

在构建自动化测试的脚本时候,我们可能会有不同环境的测试需求,如何实现在不同的测试环境之间切换呢?接下来介绍的这种方法,可以自定义命令行参数,从而根据不同的参数值实现不同环境的切换. 解决办法: 使用h ...

7. leetcode 875. 爱吃香蕉的珂珂

珂珂喜欢吃香蕉.这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 h 小时后回来. 珂珂可以决定她吃香蕉的速度 k (单位:根/小时).每个小时,她将会选择一堆香蕉, ...

8. Day17-JavaSE总结

不多说了,直接去看视频吧! 链接 完结撒花!!!

9. UGUI让自动布局下的子物体不接受布局（LayoutGroup）影响

在子物体上添加Layout Element组件 看到这个组件上有个Ignore Layout,这个就是忽视布局,把它勾上就可以忽视父级对它的布局了. 转自:https://zhuanlan.zhihu ...

10. 自动化测试工具selenium的常用定位方法

定位方法不仅限于这些,我也会随时补充,大家有其他补充或建议可以在评论区一起讨论哦!!!     [打开链接]drive.get("https://www.baidu.com")   ...