网络流

定义:

  • 对于任意一张有向图(也就是网络),其中有n个点,m条边,源点s,汇点t,边称为容量。
  • 源点:只进不出的点
  • 汇点:只出不进的点

特征:

  • 每条边的流量不能超过边的容量
  • 正向边的流量=反向边的流量
  • 正向流量和=反向流量和

残量网络:

  • 在任意时刻,网络中的所有节点以及剩余容量大于0的边构成的子图被称为残量网络。

最大流:

  • 从源点到汇点所能形成的最大流量

网络最大流模板题

第一种最大流算法:

  • Edmonds−Karp增广路算法(简称EK算法)
  • 增广路:一条从S到T的一条路径上的所有边的剩余容量都大于0的路径。
  • 算法思想:不断的用bfs搜索增广路并且更新最大流量值,直到网络上不存在增广路为止。
  • 反向边:一条边可能有多条增广路经过,建立反向边就是为了使该边有多次被选择的机会。
/******************************************************************************************
 链式前向星建图
******************************************************************************************/
#include<bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define mod 1000000007
#define INF 0x3f3f3f
#define fi first
#define se second
#define it iterator
#define ins insert
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define np next_permutation
#define pq priority_queue
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset(a,x,sizeof(a))
#define cio ios::sync_with_stdio(false)  // 不能和C的输入混用

inline ll gcd(ll a,ll b){
   return b == 0? a:gcd(b, a % b);}
inline int lowbit(int x){
   return x&(-x);}

#define S(n) setiosflags(ios::fixed)  << setprecision(n)
#define T int t;scanf("%d",&t);while(t--)
#define Ce cout << endl
#define C(n,m) cout << S(n) << m << endl
#define CY cout << "YES" << endl
#define CN cout << "NO" << endl
#define Cy cout << "Yes" << endl
#define Cn cout << "No" << endl
#define N 550010

int n, m;  				// 一共n个节点,m条边
int s, t; 				// s:源点 t:汇点
int u, v;		
ll w, ans;				// ans:最大流
int cnt = 1;			// 边数
int vis[520010];		// 每次bfs中标记节点是否被访问过
ll dis[520010];			// 从源点到达某一点的路径上的最大流量
int pre[520010];		// 与该节点相连的上一条边
int head[520010];		// 以u为起点的边上一次出现的边的编号
int flag[2510][2510];	// 存储u-v的反向边的编号

struct node
{
   
	// to:边的终点
	// ne:同一起点的上一条边
	// val:边的权值
	int to, ne; 
	ll val;  		
}e[520010];

inline void add(</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值