代码
#define MAXN 10000
#define INF 0x7fffffff
typedef struct {
int from;
int to;
int flow;
int capacity;
} Edge;
int nNode, nEdge;
vector<Edge> edges;
vector<int> adj[MAXN];
int level[MAXN];
int src, dst;
int min(int a, int b) {return (a < b) ? a : b;}
void init() {
for (int i = 0; i < nNode; i++) adj[i].clear();
edges.clear();
}
void addEdge(int from, int to, int capacity) {
edges.push_back((Edge){from, to, 0, capacity});
edges.push_back((Edge){to, from, 0, 0});
int sz = edges.size();
adj[from].push_back(sz-2);
adj[to].push_back(sz-1);
}
bool dinic_bfs() {
queue<int> Q;
memset(level, 0, sizeof(level));
Q.push(src);
level[src] = 1;
while (!Q.empty()) {
int node = Q.front();
Q.pop();
for (int i = 0; i < adj[node].size(); i++) {
Edge e = edges[adj[node][i]];
int next = e.to;
if (level[next] || e.capacity <= e.flow) continue;
level[next] = level[node] + 1;
Q.push(next);
}
}
return level[dst] != 0;
}
int dinic_dfs(int node, int flow) {
if (node == dst) return flow;
int temp = flow;
for (int i = 0; i < adj[node].size(); i++) {
int eid = adj[node][i];
Edge e = edges[eid];
int next = e.to;
if (level[next] != level[node]+1 || e.capacity <= e.flow) continue;
int t = dinic_dfs(next, min(temp, e.capacity - e.flow));
edges[eid].flow += t;
edges[eid^1].flow -= t;
temp -= t;
if (!temp) break;
}
return flow - temp;
}
int dinic() {
int result = 0;
int flow = 0;
while (dinic_bfs())
while ((flow = dinic_dfs(src, INF)))
result += flow;
return result;
}
用法
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
int main() {
scanf("%d%d%d%d", &nNode, &nEdge, &src, &dst);
src--;
dst--;
for (int i = 0; i < nEdge; i++) {
int from, to, capacity;
scanf("%d%d%d", &from, &to, &capacity);
addEdge(from-1, to-1, capacity);
}
printf("%d\n", dinic());
}