定义:
- 对于任意一张有向图(也就是网络),其中有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)
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;
int s, t;
int u, v;
ll w, ans;
int cnt = 1;
int vis[520010];
ll dis[520010];
int pre[520010];
int head[520010];
int flag[2510][2510];
struct node
{
int to, ne;
ll val;
}e[520010];
inline void add(</