zoukankan      html  css  js  c++  java
  • 网络流板子

    最大流

     1 struct Dinic
     2 {
     3     int head[maxn], tot, cur[maxn];
     4     int dis[maxn];
     5     int s, e;
     6     queue<int>q;
     7 
     8     struct node
     9     {
    10         int v, w;
    11         int next;
    12     }p[maxn];
    13 
    14     void init()
    15     {
    16         tot = 0;
    17         memset(head, -1, sizeof head);
    18     }
    19 
    20     void add(int u, int v, int w)
    21     {
    22         p[tot].v = v;
    23         p[tot].w = w;
    24         p[tot].next = head[u];
    25         head[u] = tot++;
    26     }
    27 
    28     void addEdge(int u, int v, int w)
    29     {
    30         add(u, v, w);
    31         add(v, u, 0);
    32     }
    33 
    34     bool bfs()
    35     {
    36         memset(dis, 0, sizeof dis);
    37         while (!q.empty())   q.pop();
    38         dis[s] = 1;
    39         q.push(s);
    40         while (!q.empty())
    41         {
    42             int x = q.front();
    43             q.pop();
    44             for (int i = head[x]; i != -1; i = p[i].next)
    45             {
    46                 int v = p[i].v, w = p[i].w;
    47                 if (!dis[v] && w)
    48                 {
    49                     dis[v] = dis[x] + 1;
    50                     q.push(v);
    51                 }
    52             }
    53         }
    54         if (dis[e])  return true;
    55         return false;
    56     }
    57 
    58     int dfs(int x, int W)
    59     {
    60         if (x == e || W == 0)  return W;
    61         int res = 0;
    62         for (int i = cur[x]; i != -1; i = p[i].next)
    63         {
    64             cur[x] = p[i].next;
    65             int v = p[i].v, w = p[i].w;
    66             if (dis[v] == dis[x] + 1)
    67             {
    68                 int f = dfs(v, min(w, W));
    69                 p[i].w -= f;
    70                 p[i ^ 1].w += f;
    71                 W -= f;
    72                 res += f;
    73                 if (W == 0)    break;
    74             }
    75         }
    76         return res;
    77     }
    78 
    79     int getMaxFlow()
    80     {
    81         int ans = 0;
    82         while (bfs())
    83         {
    84             for (int i = s; i <= e; ++i) cur[i] = head[i];
    85             ans += dfs(s, inf);
    86         }
    87         return ans;
    88     }
    89 };
    Dinic

    费用流

     1 struct Min_Cost_Max_Flow
     2 {
     3     struct Edge
     4     {
     5         int from, to, cap, flow, cost;
     6     };
     7     
     8     vector<Edge>edges;
     9     vector<int>G[maxn];
    10     bool vis[maxn];
    11     int d[maxn], p[maxn], a[maxn];
    12     int n, m, s, t;
    13     
    14     void init(int n, int s, int t)
    15     {
    16         this->n = n, this->s = s, this->t = t;
    17         for (int i = 1; i <= n; ++i)
    18         {
    19             G[i].clear();
    20         }
    21         edges.clear();
    22     }
    23     
    24     void add_edge(int from, int to, int cap, int cost)
    25     {
    26         edges.push_back({ from,to,cap,0,cost });
    27         edges.push_back({ to,from,0,0,-cost });
    28         m = edges.size();
    29         G[from].push_back(m - 2);
    30         G[to].push_back(m - 1);
    31     }
    32 
    33     bool SPFA(int& flow, int& cost)
    34     {
    35         memset(d, inf, sizeof d);
    36         memset(vis, false, sizeof vis);
    37         memset(p, -1, sizeof p);
    38         d[s] = 0, vis[s] = true, p[s] = 0, a[s] = inf;
    39 
    40         std::queue<int>que;
    41         que.push(s);
    42         while (!que.empty())
    43         {
    44             int u = que.front();
    45             que.pop();
    46             vis[u] = false;
    47             for (int i = 0; i < G[u].size(); ++i)
    48             {
    49                 Edge& e = edges[G[u][i]];
    50                 if (e.cap > e.flow&& d[e.to] > d[u] + e.cost)
    51                 {
    52                     d[e.to] = d[u] + e.cost;
    53                     p[e.to] = G[u][i];
    54                     a[e.to] = std::min(a[u], e.cap - e.flow);
    55                     if (!vis[e.to])
    56                     {
    57                         vis[e.to] = true;
    58                         que.push(e.to);
    59                     }
    60                 }
    61             }
    62         }
    63 
    64         if (d[t] == inf)   return false;
    65         flow += a[t];
    66         cost += d[t] * a[t];
    67         int u = t;
    68         while (u != s)
    69         {
    70             edges[p[u]].flow += a[t];
    71             edges[p[u] ^ 1].flow -= a[t];
    72             u = edges[p[u]].from;
    73         }
    74         return true;
    75     }
    76 
    77     void solve(int& flow, int& cost)
    78     {
    79         flow = cost = 0;
    80         while (SPFA(flow, cost));
    81     }
    82 };
    Min_Cost_Max_Flow

    最小费用最大流:模板

    最大费用最大流:费用变负数

  • 相关阅读:
    Abp Hangfire 占用 PostgreSql 连接数的另类解决方案
    Git 仓库中文件大小写重命名实践(Windows 环境)
    C# WinForm 文件夹选择控件 folderBrowserDialog 的应用实例
    使用 C# 修改文件创建时间(图片也可修改)
    ABP 在 EntityFramework 中使用扩展批量更新时的异常
    Visual Studio之“生成事件”实践
    博客专家纪念
    深入浅出-应用服务
    如何管理 .NET Core 工具
    深入浅出-可定制仓储设计
  • 原文地址:https://www.cnblogs.com/zhang-Kelly/p/12384626.html
Copyright © 2011-2022 走看看