Dinic

来源:互联网 发布:淘宝店铺是怎么升级的 编辑:程序博客网 时间:2024/06/08 04:04
#include <cstdio>#include <cstring>#include <iostream>#include <queue>#include <vector>#define MAXV 1000#define INF 0xfffffusing namespace std;struct edge {    int to;     //终点    int cap;    //容量    int rev;    //方向边下标};vector<edge> G[MAXV];   //图的邻接表int level[MAXV];        //顶点到源点的距离标记int iter[MAXV];         //当前弧,在其之前的边已经没有用了void add_edge(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> que;    level[s] = 0;    que.push(s);    while(!que.empty()) {        int from = que.front();        que.pop();        for(int i = 0; i < G[from].size(); ++i) {            edge &e = G[from][i];            if(e.cap > 0 && level[e.to] < 0) {                level[e.to] = level[from] + 1;                que.push(e.to);            }        }    }}int bfs(int from, int to, int f) {    if(from == to)        return f;    for(int &i = iter[from]; i < G[from].size(); ++i) {        edge& e = G[from][i];        if(e.cap > 0 && level[from] < level[e.to]) {            int d = dfs(e.to, to, 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;    for(;;) {        bfs(s);        if(level[t] < 0)            return flow;        memset(iter, 0, sizeof(iter));        int f;        while((f = dfs(s, t, INF)) > 0)            flow += f;    }}

原创粉丝点击