• 最短增广路算法


    Dinic算法

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 0x3f3f3f3f
     4 #define M(a, b) memset(a, b, sizeof(a))
     5 const int N = 1e3 + 5;
     6 struct Edge {
     7     int from, to, cap, flow;
     8 };
     9 
    10 struct Dinic {
    11     int n, m, s, t;
    12     vector<Edge> edges;
    13     vector<int> G[N];
    14     bool vis[N];
    15     int d[N], cur[N];
    16 
    17     void AddEdge(int from, int to, int cap) {
    18         edges.push_back((Edge){from, to, cap, 0});
    19         edges.push_back((Edge){to, from, 0, 0});
    20         m = edges.size();
    21         G[from].push_back(m-2); G[to].push_back(m-1);
    22     }
    23 
    24     bool bfs() {
    25         M(vis, 0);
    26         queue<int> q;
    27         q.push(s);
    28         d[s] = 0; vis[s] = 1;
    29         while (!q.empty()) {
    30             int x = q.front(); q.pop();
    31             for (int i = 0; i < G[x].size(); ++i) {
    32                 Edge &e = edges[G[x][i]];
    33                 if (!vis[e.to] && e.cap > e.flow) {
    34                     vis[e.to] = 1;
    35                     d[e.to] = d[x] + 1;
    36                     q.push(e.to);
    37                 }
    38             }
    39         }
    40         return vis[t];
    41     }
    42 
    43     int dfs(int x, int a) {
    44         if (x == t || a == 0) return a;
    45         int flow = 0, f;
    46         for (int &i = cur[x]; i < G[x].size(); ++i) {
    47             Edge &e = edges[G[x][i]];
    48             if (d[e.to] == d[x] + 1 && (f = dfs(e.to, min(a, e.cap-e.flow))) > 0) {
    49                 e.flow += f;
    50                 edges[G[x][i]^1].flow -= f;
    51                 flow += f; a -= f;
    52                 if (a == 0) break;
    53             }
    54         }
    55         return flow;
    56     }
    57 
    58     int Maxflow(int s, int t) {
    59         this->s = s; this->t = t;
    60         int flow = 0;
    61         while (bfs()) {
    62             M(cur, 0);
    63             flow += dfs(s, INF);
    64         }
    65         return flow;
    66     }
    67 
    68 };
    View Code
  • 相关阅读:
    VS 格式化代码 Ctrl + K, Ctrl + F
    VS NuGet使用
    VS书签的应用
    ASP.Net简单的交互案例
    英文书也没有那么难,跟着例子做,挺有意思的
    .Net强类型视图
    .Net视图机制
    .Net MVC小尝试
    ASP.Net MVC默认目录结构
    .Net中常用的几种ActionResult
  • 原文地址:https://www.cnblogs.com/robin1998/p/6724706.html
Copyright © 2020-2023  润新知