zoukankan      html  css  js  c++  java
  • Dinic算法模板

    详解:http://blog.csdn.net/wall_f/article/details/8207595

    算法时间复杂度:O(E * V * V)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <queue>
     4 #include <vector>
     5 using namespace std;
     6 #define N 105
     7 #define M 1010
     8 #define INF 0x3f3f3f3f
     9 
    10 struct Edge {
    11     int u, v, cap;
    12     Edge () {}
    13     Edge (int u, int v, int cap) : u (u), v (v), cap (cap) {}
    14 }edge[N*N];
    15 vector<int> G[N];
    16 int S, T, cur[N], dis[N], tot;
    17 
    18 void Addedge(int u, int v, int cap) {
    19     G[u].push_back(tot);
    20     edge[tot++] = Edge(u, v, cap);
    21     G[v].push_back(tot);
    22     edge[tot++] = Edge(v, u, 0);
    23 }
    24 
    25 int BFS() { // 找层次图
    26     queue<int> que;
    27     while(!que.empty()) que.pop();
    28     memset(dis, INF, sizeof(dis));
    29     que.push(S);
    30     dis[S] = 0;
    31     while(!que.empty()) {
    32         int u = que.front(); que.pop();
    33         for(int i = 0; i < G[u].size(); i++) {
    34             Edge &e = edge[G[u][i]];
    35             if(dis[e.v] == INF && e.cap > 0) {
    36                 dis[e.v] = dis[u] + 1;
    37                 que.push(e.v);
    38             }
    39         }
    40     }
    41     return dis[T] != INF;
    42 }
    43 
    44 int DFS(int u, int maxflow) { // 找增广路
    45     if(u == T) return maxflow; // 
    46     for(int i = cur[u]; i < G[u].size(); i++) {
    47         cur[u] = i;  // 当前弧优化
    48         Edge &e = edge[G[u][i]];
    49         if(dis[e.v] == dis[u] + 1 && e.cap > 0) {
    50             int flow = DFS(e.v, min(e.cap, maxflow)); // 找到增广路上最小的流量增量
    51             if(flow) {
    52                 e.cap -= flow;
    53                 edge[G[u][i]^1].cap += flow;
    54                 return flow;
    55             }
    56         }
    57     }
    58     return 0; // 找不到增广路
    59 }
    60 
    61 int Dinic() {
    62     int ans = 0;
    63     while(BFS()) {
    64         int flow;
    65         memset(cur, 0, sizeof(cur));
    66         while(flow = DFS(S, INF)) ans += flow;
    67     }
    68     return ans;
    69 }
  • 相关阅读:
    PHP WEB项目文件夹上传下载解决方案
    .NET WEB项目文件夹上传下载解决方案
    C#.NET WEB项目文件夹上传下载解决方案
    python 多重继承
    python 多态
    python 类型判断-- isinstance函数
    python 继承
    hdu 5692 Snacks 线段树+dfs
    线段树的输出
    python 定义类方法
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6208921.html
Copyright © 2011-2022 走看看