Pagini recente » Cod sursa (job #113187) | Cod sursa (job #3180661) | Cod sursa (job #2944335) | Cod sursa (job #21862) | Cod sursa (job #942322)
Cod sursa(job #942322)
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define in "maxflow.in"
#define out "maxflow.out"
#define N 1005
#define INF 1 << 30
queue <int> Q;
int F[N][N], C[N][N], n, m, S, D;
vector <int> d (N, 0);
void DetSource ()
{
for (int i = 1; i <= n && !D; ++i) {
int k = 0;
for (int j = 1; j <= n; ++j)
k += (i != j && C[i][j]) ? 1 : 0;
D = !k ? i : 0;
}
for (int j = 1 ; j <= n && !S; ++j) {
int k = 0;
for (int i = 1; i <= n; ++i)
k += (i != j && C[i][j]) ? 1 : 0;
S = !k ? j : 0;
}
}
bool BFS ()
{
while (Q.size())
Q.pop();
Q.push (S);
d[S] = -1;
while (Q.size() && !d[D]) {
int x = Q.front();
for (int i = 1; i <= n; ++i)
if (!d[i]) {
if (F[x][i] < C[x][i]) {
d[i] = x;
Q.push (i);
}
else
if (F[i][x] > 0) {
d[i] = -x;
Q.push (i);
}
}
Q.pop();
}
return !d[D];
}
int main ()
{
ifstream fin (in);
fin >> n >> m;
for (int i = 0; i < m; ++i) {
int x, y, c;
fin >> x >> y >> c;
C[x][y] = c;
}
fin.close();
DetSource ();
vector <int> L;
do {
L.resize (0);
for (int i = 1; i <= n; ++i)
d[i] = 0;
if (BFS())
break;
L.push_back (D);
int a = INF, b = INF;
while (L[L.size()-1] != S) {
L.push_back (d[L.back()]);
if (d[L[L.size()-2]] > 0)
a = min (a, C[L.back()][L[L.size()-2]] - F[L.back()][L[L.size()-2]]);
else
b = min (b, F[L[L.size()-2]][L.back()]);
}
int v = min (a, b);
for (int i = L.size() - 1; i >= 0; --i)
if (L[i-1] > 0)
F[L[i]][L[i-1]] += v;
else
F[L[i-1]][L[i]] -= v;
} while (1);
ofstream fout (out);
int flux = 0;
for (int i = 1; i <= n; ++i)
flux += F[i][D];
fout << flux;
fout.close();
return 0;
}