Pagini recente » Cod sursa (job #2170610) | Cod sursa (job #1817957) | Cod sursa (job #1512873) | Cod sursa (job #1129877) | Cod sursa (job #2376559)
#include <bits/stdc++.h>
#define maxN 1002
#define inf 0x3fffffff
using namespace std;
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
int n;
vector < int > G[maxN];
int c[maxN][maxN];
int S, D, f[maxN][maxN];
int prv[maxN];
queue < int > Q;
int ans;
void AddEdge(int u, int v, int cap)
{
G[u].push_back(v);
G[v].push_back(u);
c[u][v] = cap;
}
bool bfs()
{
Q.push(S);
for (int i = 0; i < n; ++ i)
prv[i] = -1;
while (!Q.empty())
{
int nod = Q.front();
Q.pop();
if (nod == D) continue;
for (int adj : G[nod])
if (prv[adj] == -1 && c[nod][adj] > f[nod][adj])
{
prv[adj] = nod;
Q.push(adj);
}
}
return (prv[D] != -1);
}
int main()
{
int m;
scanf("%d%d", &n, &m);
S = 0;
D = n - 1;
while (m --)
{
int u, v, cap;
scanf("%d%d%d", &u, &v, &cap);
-- u;
-- v;
AddEdge(u, v, cap);
}
while (bfs())
{
int cap = inf;
for (int u : G[D])
if (prv[u] != -1 && c[u][D] > f[u][D])
{
prv[D] = u;
int v = D;
while (v != S)
{
cap = min(cap, c[prv[v]][v] - f[prv[v]][v]);
v = prv[v];
}
if (!cap) continue;
v = D;
while (v != S)
{
f[prv[v]][v] += cap;
f[v][prv[v]] -= cap;
v = prv[v];
}
ans += cap;
}
}
printf("%d\n", ans);
return 0;
}