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; }}