Pagini recente » Cod sursa (job #82268) | Cod sursa (job #988799) | Cod sursa (job #2228834) | Cod sursa (job #1356010) | Cod sursa (job #1170127)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stdlib.h>
using namespace std;
ifstream fi ("maxflow.in");
ofstream fo ("maxflow.out");
const int dim = 1005;
const int OO = (1<<31) - 1;
int N, M, source, sink;
int C[dim][dim], F[dim][dim], P[dim], D[dim];
vector <int> V[dim];
void read ()
{
fi >> N >> M;
for (int i = 1, x, y, z; i <= M; i++)
{
fi >> x >> y >> z;
C[x][y] = z;
V[x].push_back (y);
V[y].push_back (x);
}
source = 1;
sink = N;
}
bool bfs ()
{
int n, v, i;
queue <int> Q;
Q.push (source);
for (i = 1; i <= N; i++)
{
P[i] = 0;
D[i] = OO;
}
P[source] = -1;
while (!Q.empty())
{
n = Q.front ();
Q.pop ();
for (i = 0; i < V[n].size(); i++)
{
v = V[n][i];
if (C[n][v] - F[n][v] > 0 && P[v] == 0)
{
P[v] = n;
if (v == sink)
return true;
Q.push (v);
}
}
}
if (P[sink] != 0)
return true;
return false;
}
void edmonds_karp ()
{
int m, n, p, i, leaf, k=0;
int flow = 0;
while (bfs ())
{
bool ok = false;
for (i = 0; i < V[sink].size(); i++)
{
leaf = V[sink][i];
if (P[leaf] == 0)
continue;
m = C[leaf][sink] - F[leaf][sink];
for (n = leaf, p = P[leaf]; n != source; n = P[n], p = P[p])
m = min (m, C[p][n] - F[p][n]);
if (m == 0) continue;
ok = true;
for (n = leaf, p = P[leaf]; n != source; n = P[n], p = P[p])
{
F[p][n] += m;
F[n][p] -= m;
}
F[leaf][sink] += m;
F[sink][leaf] -= m;
}
if (ok == false)
break;
}
for (int i = 0; i < V[source].size(); i++)
{
flow += F[source][V[source][i]];
}
fo << flow << '\n';
}
int main()
{
read ();
edmonds_karp ();
return 0;
}