Dinic 算法模板

来源:互联网 发布:网络服务器配置与管理 编辑:程序博客网 时间:2024/06/07 18:45
#include<cstdio>#include<iostream>#include<vector>#include<cstring>#include<queue>using namespace std;struct edge{    int to, cap, rev;    edge(){}    edge(int b, int c, int d) :to(b), cap(c), rev(d) {}};const int maxv = 100 + 10;const int maxn = 1000 + 10;const int inf  = 0x3f3f3f3f;vector<edge> G[maxv];int level[maxv];int iter[maxv];void add(int from, int to, int cap){    G[from].push_back(edge(to, cap, G[to].size()));    G[to].push_back(edge(from, 0, G[from].size() - 1));}void bfs(int s){    memset(level, -1, sizeof level);    queue<int> qu;    level[s] = 0;    qu.push(s);    while(qu.size())    {        int v = qu.front();        qu.pop();        for(int i= 0; i< G[v].size(); i++)        {            edge e = G[v][i];            if(e.cap > 0 && level[e.to] < 0)            {                level[e.to] = level[v] + 1;                qu.push(e.to);            }        }    }}int dfs(int v, int t, int f){    if(v == t) return f;    for(int &i= iter[v]; i< G[v].size(); i++)    {        edge &e = G[v][i];        if(e.cap > 0 && level[e.to] > level[v])        {            int d = dfs(e.to, t, min(f, e.cap));            if(d > 0)            {                e.cap -= d;                G[e.to][e.rev].cap += d;                return d;            }        }    }    return 0;}int max_flow(int s, int t){    int flow = 0;    while(1)    {        bfs(s);        if(level[t] < 0) return flow;        memset(iter, 0, sizeof iter);        while(1)        {            int f = dfs(s, t, inf);            if(f == 0) break;            flow += f;        }    }}
原创粉丝点击