首页 > 其他分享 >[Flows] 网络流做题记录

[Flows] 网络流做题记录

时间:2024-02-16 20:11:54浏览次数:19  
标签:Templates 记录 int 网络 Flows 流做题

Some Templates

Maximum Flow (Minimum Cut)

template < class T, int N, int M >
struct MaxFlow {
  int cnt = 1, head[N], nxt[M << 1], node[M << 1], dep[N], cur[N], n, flow_sink;
  T flows[M << 1];
  void add_edge (int u, int v, T w) {
    cnt ++, nxt[cnt] = head[u], head[u] = cnt, node[cnt] = v, flows[cnt] = w;
    cnt ++, nxt[cnt] = head[v], head[v] = cnt, node[cnt] = u, flows[cnt] = 0;
    return ;
  }
  T dfs (int u, T remain) {
    if (u == flow_sink) return remain;
    T res = 0;
    for (int i = cur[u]; i && remain; i = nxt[i]) {
      cur[u] = i;
      T f = std :: min (remain, flows[i]);
      int v = node[i];
      if (dep[u] + 1 == dep[v] && f) {
        T f_ = dfs (v, f);
        res += f_, remain -= f_;
        flows[i] -= f_, flows[i ^ 1] += f_;
      }
    }
    if (!res) dep[u] = -1;
    return res;
  }
  T Flow (int source, int sink) {
    flow_sink = sink;
    T res = 0;
    while (true) {
      std :: queue < int > q;
      while (!q.empty ()) q.pop ();
      for (int i = 0;i <= n; ++ i) cur[i] = head[i], dep[i] = -1;
      q.push (source), dep[source] = 0;
      while (!q.empty ()) {
        int u = q.front ();
        q.pop ();
        for (int i = head[u]; i ; i = nxt[i]) {
          if (dep[node[i]] == -1 && flows[i]) {
            dep[node[i]] = dep[u] + 1;
            q.push (node[i]);
          }
        }
      }
      if (dep[sink] == -1) return res;
      res += dfs (source, 1e18);
    }
    return 0;
  }
  void init (int n_) {
    n = n_;
    cnt = 1;
    for (int i = 1;i <= n; ++ i) head[i] = 0;
    return ;
  }
};

标签:Templates,记录,int,网络,Flows,流做题
From: https://www.cnblogs.com/RB16B/p/18017426

相关文章

  • Unity 类胡闹厨房游戏 KitchenChaos 阶段1整理记录
    原教程地址:https://youtu.be/AmGSEH7QcDg部分代码:usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPlayerAnimator:MonoBehaviour{privateconststringIS_WALKING="IsWalking";[SerializeField]priv......
  • 【记录】 unity插件 Addressables
    介绍Addressables是Unity官方推出的用于资源热更的系统,可在PackageManager里面下载。安装可在PackageManager里面下载、安装即可使用配置Addressables配置使用基础Addressables使用远程分发Addressables远程分发......
  • DP 做题记录
    复杂DP各种巨大DP。CF123CBrackets题意:括号数组是一个只有“(”或“)”两类字符的二维数组。括号数组中的合法路径只能从任意位置开始,向右或向下移动。如果一个n×m括号数组中从(1,1)到(n,m)的所有路径经过的字符构成的字符串均为可以完全匹配的括号序列,则这个括号......
  • css table 设置记录
     td,th{padding:3px7px2px7px;font-weight:bold;--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#......
  • NJU PA4.1记录
    PA4-虚实交错的魔法:分时多任务多道程序上下文切换内核线程实现上下文切换(1)首先是kcontext(),理解讲义之后我们会发现其实很简单,就是让我们创建一个Context*cp指向所给的栈底位置,然后把entry填入Context的mepc中,为了后续在__am_asm_trap中mret时会返回到f函数中,这里的减4是为......
  • NOI真题记录
    NOI真题记录一些做过的NOI真题。NOI2013向量内积题意:有\(n\)个\(d\)为向量,求是否有两对向量的点积是2或3的倍数。思路:先random_shuffle一下,然后一次判断和前面的和的乘积,如果发现出现了不满足全部模起来都不为0就说明出现了答案,与前面的每一个判断一下就可以了。......
  • 数位 DP 做题记录
    数位DP数位DP的常见套路就是记录当前到哪一位,是否抵着上界,转移时枚举当前可以填哪些数,做一遍记忆化搜索。P3413SAC#1-萌数题意:求\([l,r]\)中有多少个数中含有回文子串。思路:如果存在回文子串,那么必然有相邻两位相同或者间隔一位相同,在数位DP时额外记录前2位就可以......
  • 势能相关做题记录
    势能相关P5905【模板】全源最短路(Johnson)题意:有负权情况下的全源最短路。思路:Johnson全源最短路可以在\(O(nm\logm)\)的复杂度内解决带有负权的全源最短路。这个算法的巧妙之处在于为每个点赋予势能\(h_i\)。从一个点到另一个点,无论走什么路径,势能的变化量都是一定的。......
  • 数学题做题记录
    数学主要是计数和数论函数相关。[AGC031F]WalkonGraph题意:有一张\(n\)个点\(m\)条边的无向连通图\(G\),每条边有长度\(L_i\),有一个人在上面游走。有\(q\)组询问,每组询问给出\(s_i,t_i,r_i\),询问是否存在一条从\(s_i\)出发到\(t_i\)结束且长度为\(r_i\)的路径......
  • manjaro 开机黑屏问题记录
    环境信息系统:manjaro-kde6.6.12-1-MANJARO显卡:RadeonRX5802048SP问题描述偶现开机黑屏,无法进入登录界面,无法进入tty检查/var/log/Xorg.0.log日志,可以发现以下异常信息:AMDGPU(0):getvblankcounterfailed:Invalidargument很有可能是AMD图形驱动模块AMDGPU......