Pagini recente » Cod sursa (job #2325293) | Cod sursa (job #2277063) | Cod sursa (job #2403142) | Cod sursa (job #76641) | Cod sursa (job #2416415)
#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, m;
int S, D, C[maxN][maxN];
vector < int > V[maxN];
int F[maxN][maxN], par[maxN];
bool vis[maxN];
int ans;
bool bfs()
{
queue < int > Q;
//Q.clear();
memset(vis, 0, sizeof(vis));
Q.push(S);
vis[S] = true;
while (!Q.empty())
{
int u = Q.front();
Q.pop();
for (int v : V[u]) if (C[u][v] != F[u][v] && !vis[v])
{
if (v == D) return true;
vis[v] = true;
par[v] = u;
Q.push(v);
}
}
return false;
}
void AddEdge(int u, int v, int c)
{
V[u].push_back(v);
V[v].push_back(u);
C[u][v] += c;
}
int MaxFlow()
{
int ans = 0;
while (bfs())
{
for (int i = 0; i < D; ++ i)
if (vis[i] && F[i][D] != C[i][D])
{
par[D] = i;
int crtFlow = inf, nod = D;
while (nod != S)
{
crtFlow = min(crtFlow, -F[par[nod]][nod] + C[par[nod]][nod]);
nod = par[nod];
}
nod = D;
while (nod != S)
{
F[par[nod]][nod] += crtFlow;
F[nod][par[nod]] -= crtFlow;
nod = par[nod];
}
ans += crtFlow;
}
}
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; ++ i)
{
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
-- u;
-- v;
AddEdge(u, v, c);
}
S = 0;
D = n - 1;
printf("%d\n", MaxFlow());
return 0;
}