Pagini recente » Cod sursa (job #272361) | Cod sursa (job #372681) | Cod sursa (job #1619992) | Cod sursa (job #2631070) | Cod sursa (job #2223835)
#include <bits/stdc++.h>
#define inf 0x7fffffff
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
using namespace std;
class Graph
{
int V;
int *par, **r;
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];
r = new int *[V];
//f = new int *[V];
for (int i = 0; i < V; ++ i)
{
r[i] = new int[V];
//f[i] = new int[V];
for (int j = 0; j < V; ++ j)
//c[i][j] =
r[i][j] = 0;
}
}
void Graph::addEdge(int u, int v, int cap)
{
r[u][v] = cap;
}
void Graph::BFS(int S, int D)
{
queue < short 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 (r[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 (r[u][D] > 0 && par[u] != -1)
{
ok = true;
par[D] = u;
int nod = D, cap = inf;
while (nod != S)
{
cap = min(cap, r[par[nod]][nod]);
nod = par[nod];
}
nod = D;
flow += cap;
while (nod != S)
{
r[par[nod]][nod] -= cap;
r[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;
}