#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 11000;
const int INF = 1e9;
struct Edge {
int u, v;
int cap, flow;
Edge(int u_, int v_, int cap_, int flow_) : u(u_), v(v_), cap(cap_), flow(flow_) {}
};
int n, s, t;
std::vector<Edge> edges;
std::vector<int> g[MAXN];
bool visited[MAXN];
int depth[MAXN];
int current[MAXN];
void init() {
edges.clear();
for(int i = 0; i < n; ++i) g[i].clear();
}
void addEdge(int u, int v, int cap) {
int index0 = edges.size(), index1 = index0 + 1;
edges.push_back(Edge(u, v, cap, 0));
edges.push_back(Edge(v, u, 0, 0));
g[u].push_back(index0);
g[v].push_back(index1);
}
bool bfs() {
for(int i = 0; i < n; ++i) visited[i] = false, depth[i] = 0;
std::queue<int> q;
visited[s] = true;
depth[s] = 0;
q.push(s);
do {
int u = q.front();
q.pop();
for(int i = 0; i < int(g[u].size()); ++i) {
Edge& e = edges[g[u][i]];
int v = e.v;
if(visited[v] || e.flow >= e.cap) continue;
visited[v] = true;
depth[v] = depth[u] + 1;
q.push(v);
}
} while(!q.empty());
return visited[t];
}
int dfs(int u, int flow) {
if(u == t || !flow) return flow;
int result = 0;
for(int& i = current[u]; i < int(g[u].size()); ++i) {
Edge& e = edges[g[u][i]];
int v = e.v;
if(depth[v] != depth[u] + 1) continue;
int f = dfs(v, std::min(flow, e.cap - e.flow));
if(!f) continue;
Edge& r = edges[g[u][i] ^ 1];
e.flow += f;
r.flow -= f;
result += f;
flow -= f;
if(!flow) break;
}
return result;
}
int dinic() {
int result = 0;
while(bfs()) {
for(int i = 0; i < n; ++i) current[i] = 0;
result += dfs(s, INF);
}
return result;
}
int main() {
int n, m;
std::scanf("%d%d%d%d", &n, &m, &s, &t);
::n = n;
--s, --t;
init();
for(int i = 0; i < m; ++i) {
int u, v;
int w;
std::scanf("%d%d%d", &u, &v, &w);
--u, --v;
addEdge(u, v, w);
}
int result = dinic();
std::printf("%d\n", result);
}
模板积累——网络流建图及dinic算法
最新推荐文章于 2021-05-03 14:29:51 发布