最大流Ford_Fulkerson

2024-04-28 17:18
文章标签 最大 ford fulkerson

本文主要是介绍最大流Ford_Fulkerson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

#include<iostream>
#include<vector>
using namespace std;
#define INF 0x0fffffff
#define min(a,b)(a<b?a:b)
#define MAX_V 1000
struct edge
{
 int to,cap,rev; //指向to的反向边的标号
 edge(){}
 edge(int a,int b,int c):to(a),cap(b),rev(c){}
};
vector<edge>G[MAX_V];
bool used[MAX_V];

void add_edge(int from,int to,int cap) 
{
 G[from].push_back(edge(to,cap,G[to].size()));  
 G[to].push_back(edge(from,0,G[from].size()-1));
}

int dfs(int v,int t,int f)
{
 if(v==t)
  return f;
 used[v]=true;
 for(int i=0;i<G[v].size();i++)
 {
  edge &e=G[v][i];
  if(!used[e.to]&&e.cap>0)
  {
   int d=dfs(e.to,t,min(f,e.cap));
   if(d>0)
   {
    e.cap-=d;
    G[e.to][e.rev].cap+=d;
    return d;
   }
  }
 }
 return 0;
}
int max_flow(int s,int t)
{
 int flow=0;
 while(1)
 {
  memset(used,0,sizeof(used));
  int f=dfs(s,t,INF); //每次找到一条可行流
  if(f==0) return flow;
  flow+=f;
 }
 return flow;
}
int main()
{
 
}

 

这篇关于最大流Ford_Fulkerson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943808

相关文章

关于修改计算机的处理器数和最大内存数的问题

问题描述: 刚开始本来是想让计算机的运行速度运行的快点,于是在网上搜索如何让计算机的运行速度更快,找到了一种关于修改计算机内存数和计算机的处理核数可以让计算机运行的更快。 遇到问题: 当我通过命令msconfig →引导→高级选项→勾选了处理器数和最大内存数,然后重启,结构整个计算机都卡的要死,于是记录下来。网上的答案有时候真的是很不负责任,也有可能是自己技术不到位。 结果:取消处理器和内

LeetCode 算法:二叉树的最大深度 c++

原题链接🔗:二叉树的最大深度 难度:简单⭐️ 题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root = [1,null,2] 输出:2 提示: 树中节点的数量在 [0, 104] 区间内。-1

「LeetCode 084」最大面积

题目地址: https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。 example 第一种方法,我们先确定左右两个边界,然后找边界中的最小值。比方说,我们左边界确定

最大子数组问题(第4章:分治策略)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。   思路 1 当我们加上一个正数时,和会

代码随想录算法训练营day62 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 暴力解法 遍历每根柱子(第一个和最后一个不需要遍历,因为不可能存住水),找到当前柱子的左边最高柱子lHeight,右边最高柱子rHeight,当前柱子能存的水为min(min(lHeight, rHeight) - 当前柱子的高度, 0) class Solution:def trap(self, height: List[int]) -> int:result = 0for

素数伴侣--最大二分匹配

#include<bits/stdc++.h>using namespace std;#define N 100int edge[N][N],cx[N],cy[N];//edge记录两点的关系,如果两点相连,则edge【i】【j】为1int visited[N];//判断该店是否被访问过int nx,ny,res;const int M=60000+100;bool prim[M];

2769. 找出最大的可达成数字

2769. 找出最大的可达成数字 题目链接:2769. 找出最大的可达成数字 代码如下: class Solution {public:int theMaximumAchievableX(int num, int t) {return num+2*t; }};

最大流的Dinic算法

基于Ford-Fulkerson方法的原始的DFS算法效率是比较低的,因此针对如何尽快的扩流存在一系列的改进算法,例如Dinic算法。Dinic算法的基本思路是:在一次搜索中,在层次间进行扩流,而不是仅对一条路径进行扩流。所谓层次,就是指各节点距离起点的路径长度。当然,每个节点的层次随着残量的变化而变化。     Dinic算法的基本流程是: 1、根据残量网络计算层次图,使用BFS; 2、

最大流的Ford-Fulkerson方法初步

网络或者网络流是一种基本的数据结构,而最大流则是网络流上的基本问题。网络本质上是一个符合一定条件的有向带权图。而最大流是最大可行流的简称,可行流是一个定义在网络流上的符合一定条件的函数。这些定义条件对于算法的正确性是不可缺少的,不过本文不描述可行流的数学条件,只介绍最大流最常用的Ford-Fulkerson方法的原理。     如上左的权图称作容量网络,边权值表示该边的容量。

Studying-代码随想录训练营day17| 654.最大二叉树、617合并二叉树、700.二叉搜索树中的搜索、98.验证二叉树搜索树

第十七天,二叉树part05,进一步学习二叉树💪 654.最大二叉树 文档讲解:代码随想录最大二叉树 视频讲解:手撕最大二叉树 题目: 学习:本题与利用中序和后序序列构造二叉树有相同之处。依据题目要求,首先在数组里面找到最大值,作为根节点,然后划分左右区间对应根节点的左右子树。再分别在左右区间中找到最大值,作为根节点(中间节点),之后再次划分区间,进行下一轮循环。 代码: