网络流理解与模板

简介: 网络流理解与模板

对于最大流与最大流等于最小割的理解

参考某大佬博客:

EK求最大流模板:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=2e4+10,INF=0x3f3f3f3f;
int h[N],f[M],ne[M],e[M],idx;
int n,m;
int S,T;
bool st[N];
int d[N];
int pre[N];
void add(int a,int b,int c)
{
    e[idx]=b,f[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool bfs()
{
    memset(d,0,sizeof(d));
    memset(st,0,sizeof(st));
    memset(pre,0,sizeof(pre));
    d[S]=INF;
    st[S]=true;
    queue<int>q;
    q.push(S);
    while(q.size())
    {
        int t=q.front();
        q.pop();
        for(int i=h[t];~i;i=ne[i])
        {
            int j=e[i];
            if(f[i]>0&&!st[j])
            {  st[j]=true;
                d[j]=min(d[t],f[i]);
                pre[j]=i;
            if(j==T) return true;
                q.push(j);
            }
        }
    }
    return false;
}
void EK()
{
    int r=0;
    while(bfs())
    {
        r+=d[T];
        for(int i=T;i!=S;i=e[pre[i]^1])//存边
        {
            int id=pre[i];
            f[id]-=d[T],f[id^1]+=d[T];
        }
    }
    printf("%d\n",r);
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&S,&T);
    memset(h,-1,sizeof(h));
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,0);
    }
    EK();
    return 0;
}

Dinic求最大流:

#include <bits/stdc++.h>
using namespace std;
const int N = 10010, M = 200010, INF = 1e8;
int n, m, S, T;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];//q是队列,d是分成,cur是优化
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 ++;
}
int bfs()
{
  memset(d, -1, sizeof d);
  int tt = 0, hh = 0;
  q[0] = S, d[S] = 0, cur[S] = h[S];//当前弧是第一个点
  while (hh <= tt)
  {
    int t = q[hh ++ ];
    for (int i = h[t]; ~i; 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[++ tt] = ver;
      }
    }
  }
  return false;
}
int find(int u, int limit )//从原点能够流向u这个点的最大流量为limit
{
  if (u == T) return limit;//如果已经到终点了 表示从原点到终点所能流的流量就是limit
  int flow = 0;//表示从u这个点开始往后流的流量是多少,dfs求,一开始是0的 
  //我们之前可能搜索u,可能有些路径满了,所以要将所有满的路径跳过
  for (int i = cur[u]; ~i && flow < limit; i = ne[i])//如果从u到终点的总流量等于limit就没有必要再搜了,因为起点到u最多就是limit 
  {
    cur[u] = i;//记录一下当前搜的弧是那个,流到第i条边,说明前面的边都流过了
    int ver = e[i];
    if (d[ver] == d[u] + 1 && f[i])//流到下一层,且当前弧可流
    {
      //从当前点开始最多可以有多少流量
      int t = find(ver, min(f[i], limit - flow));
      if (!t) //从这个点到终点没有流量,说明是不可用的,就把这个点删掉
        d[ver] = -1;//这个点到终点没有路径
      f[i] -= t, f[i ^ 1] += t, flow += t;
    }
  }
  return flow;
}
int dinic()
{
  int r = 0, flow;
  //判断如果有增广路并建立出分层图,然后找出所有增广路,将所有流量加起来
  while (bfs()) while (flow = find(S, INF)) r += flow;
  return r;
}
int main()
{
  cin >> n >> m >> S >> T;
  memset(h, -1, sizeof h);
  while (m -- )
  {
    int a, b, c; scanf("%d%d%d", &a, &b, &c);
    add(a, b, c);
  }
  printf("%d\n", dinic());
  return 0;
}
目录
相关文章
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
574 0
|
4月前
|
小程序 前端开发
网络祭祀人物微信小程序模板源码
网络祭祀人物微信小程序模板源码
48 5
|
5月前
高端响应式网络科技公司网站源码pbootcms模板
这是一款高端响应式网络科技公司网站源码pbootcms模板,适合所有类型的网络公司展示,整站源码下载,为您简化开发过程,可自适应手机端。
56 3
|
移动开发 前端开发 JavaScript
宽屏html5网络科技有限公司官网单页面响应式模板
宽屏html5网络科技有限公司官网单页面响应式模板
132 0
宽屏html5网络科技有限公司官网单页面响应式模板
|
机器学习/深度学习 算法
ML之分类预测:以六类机器学习算法(kNN、逻辑回归、SVM、决策树、随机森林、提升树、神经网络)对糖尿病数据集(8→1)实现二分类模型评估案例来理解和认知机器学习分类预测的模板流程
ML之分类预测:以六类机器学习算法(kNN、逻辑回归、SVM、决策树、随机森林、提升树、神经网络)对糖尿病数据集(8→1)实现二分类模型评估案例来理解和认知机器学习分类预测的模板流程
ML之分类预测:以六类机器学习算法(kNN、逻辑回归、SVM、决策树、随机森林、提升树、神经网络)对糖尿病数据集(8→1)实现二分类模型评估案例来理解和认知机器学习分类预测的模板流程
|
机器学习/深度学习 算法
[洛谷 P3376] 网络最大流 | 模板 (ISAP 算法) 入门
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式 第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。 输出格式 一行,包含一个正整数,即为该网络的最大流。
163 0
[洛谷 P3376] 网络最大流 | 模板 (ISAP 算法) 入门
|
机器学习/深度学习 算法
[洛谷 P3376] 网络最大流 | 模板 (Dinic算法) 入门
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式 第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。 输出格式 一行,包含一个正整数,即为该网络的最大流。
237 0
[洛谷 P3376] 网络最大流 | 模板 (Dinic算法) 入门
|
机器学习/深度学习 算法
[洛谷 P3376] 网络最大流 | 模板 Edmonds Karp(EK算法) 入门
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 输入格式 第一行包含四个正整数 n nn,m mm,s ss,t tt,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含三个正整数 ui ,vi,wi ,表示第 i 条有向边从 ui 出发,到达 vi,边权为 wi即该边最大流量为 wi)。 输出格式 一行,包含一个正整数,即为该网络的最大流。
198 0
[洛谷 P3376] 网络最大流 | 模板 Edmonds Karp(EK算法) 入门
|
JSON 网络协议 数据库
python的Socket网络编程 使用模板
相关说明 本文给出的是TCP协议的Socket编程。 其中用了一个dbmanager数据库操作模块,这个模块是我自己定义的,可以在我的另一个文章中找到这个模块的分享。
1121 0
|
弹性计算 数据中心
搭建有出入网能力的VPC网络方案及模板实现
VPC是网络隔离的专有网络,优势是与其他租户的网络完全隔离,可自定义网段,也是混合云网络互通的必选方案。对于专有网络出入网是最重要的,出网是指VPC内访问外网(SNAT),多用于抓取类业务;入网是指VPC内的应用对外提供服务(DNAT)。
5691 0
下一篇
无影云桌面