Dinic板子,只输出0
#include <bits/stdc++.h>
using namespace std;
const int N = 210, M = 10010;
class MF
{
int s, t, cnt = 1;
long long max_flow = 0;
int dep[N], head[N], rad[N];
struct Edge
{
int y, nxt;
long long cap, flow;
Edge() {}
Edge(int _y, long long _cap, int _nxt) { y = _y, cap = _cap, nxt = _nxt; }
} e[M];
bool bfs()
{
queue<int> q;
memset(dep, 0, sizeof(dep));
dep[s] = 1;
q.push(s);
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = head[x]; i; i = e[i].nxt)
{
int y = e[i].y;
if (dep[y] || e[i].cap <= e[i].flow)
continue;
dep[y] = dep[x] + 1;
q.push(y);
}
}
return dep[t];
}
long long dfs(int x, long long flow)
{
if (x == t || !flow)
return flow;
long long ret = 0;
for (int &i = rad[x]; i; i = e[i].nxt)
{
int y = e[i].y;
long long d;
if (dep[y] == dep[x] + 1 && (d = dfs(y, min(flow - ret, e[i].cap - e[i].flow))))
{
ret += d;
e[i].flow += d, e[i ^ 1].flow -= d;
if (ret == flow)
return ret;
}
}
return ret;
}
public:
MF() {}
MF(int _s, int _t) { s = _s, t = _t; }
long long get_MF() { return max_flow; }
void init()
{
memset(head, 0, sizeof(head));
cnt = 1;
}
void add(int u, int v, int w)
{
e[++cnt] = Edge(v, w, head[u]);
head[u] = cnt;
e[++cnt] = Edge(u, 0, head[v]);
head[v] = cnt;
}
long long dinic()
{
while (bfs())
{
memcpy(rad, head, sizeof(head));
max_flow += dfs(s, 9e18);
}
return max_flow;
}
};
int n, m, s, t;
int main()
{
cin >> n >> m >> s >> t;
MF d(s, t);
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
d.add(u, v, w);
}
cout << d.dinic() << endl;
return 0;
}