Pagini recente » Cod sursa (job #880228) | Cod sursa (job #1343689) | Cod sursa (job #2947198) | Cod sursa (job #1225157) | Cod sursa (job #2223832)
#include <bits/stdc++.h>
#define inf 1000000000
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
using namespace std;
class Graph
{
int V;
int *par, **f, **c;
list< pair<int, int> > *adj;
public:
Graph(int V);
void BFS(int S, int D);
void addEdge(int u, int v, int cap);
int maxFlow(int S, int D);
};
Graph::Graph(int V)
{
this->V = V;
par = new int [V];
c = new int *[V];
f = new int *[V];
for (int i = 0; i < V; ++ i)
{
c[i] = new int[V];
f[i] = new int[V];
for (int j = 0; j < V; ++ j)
c[i][j] = f[i][j] = 0;
}
}
void Graph::addEdge(int u, int v, int cap)
{
c[u][v] = cap;
}
void Graph::BFS(int S, int D)
{
queue < int > Q;
while (!Q.empty()) Q.pop();
for (int i = 0; i < V; ++ i)
par[i] = -1;
Q.push(S);
par[S] = S;
par[D] = D;
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (int i = 0; i < V - 1; ++ i)
if (c[x][i] - f[x][i] > 0 && par[i] == -1)
{
par[i] = x;
Q.push(i);
}
}
}
int Graph::maxFlow(int S, int D)
{
int flow = 0;
bool ok = true;
while (ok)
{
BFS(0, V - 1);
ok = false;
for(int u = 0; u < V - 1; u++)
if (c[u][D] - f[u][D] > 0 && par[u] != -1)
{
ok = true;
par[D] = u;
int nod = D, cap = inf;
while (nod != S)
{
cap = min(cap, c[par[nod]][nod] - f[par[nod]][nod]);
nod = par[nod];
}
nod = D;
flow += cap;
while (nod != S)
{
f[par[nod]][nod] += cap;
f[nod][par[nod]] -= cap;
nod = par[nod];
}
}
}
return flow;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
Graph g(n);
for (int i = 1; i <= m; ++ i)
{
int u, v, cap;
scanf("%d%d%d", &u, &v, &cap);
-- u;
-- v;
g.addEdge(u, v, cap);
}
printf("%d\n", g.maxFlow(0, n - 1));
return 0;
}