Pagini recente » Cod sursa (job #2989094) | Cod sursa (job #1493094) | Cod sursa (job #672924) | Cod sursa (job #2612073) | Cod sursa (job #563158)
Cod sursa(job #563158)
#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <fstream>
#define DIM 1001
#define INF 0x3f3f3f3f
using namespace std;
int n, m;
int start, dest;
long flux;
int f[DIM][DIM];
int c[DIM][DIM];
vector<int> cr, t;
int nr;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
void Read();
void EK();
void Augmentation();
bool BF();
void Write();
int main()
{
Read();
EK();
Write();
return 0;
}
void Read()
{
fin >> n >> m;
start = 1; dest = n;
int x, y, fl;
for (int i = 1; i <= m; ++i)
{
fin >> x >> y >> fl;
c[x][y] = fl;
}
fin.close();
}
void EK()
{
while (BF())
Augmentation();
}
bool BF()
{
queue<int> Q;
vector<bool> s(n + 1);
// cr.assign(n + 1, 0);
cr.clear(); cr.resize(n+1);
t.assign(n+1, 0);
cr[start] = INF;
s[start] = 1;
Q.push(start);
while (!Q.empty())
{
int i = Q.front();
Q.pop();
for (int j = 1; j <= n; ++j)
{
if (s[j]) continue;
if (c[i][j] > f[i][j])
{
cr[j] = min(cr[i], c[i][j] - f[i][j]);
t[j] = i;
s[j] = true;
Q.push(j);
if (j == dest) return true;
}
}
}
return false;
}
void Augmentation()
{
int i, j;
j = dest;
while (j != start)
{
i = t[j];
f[i][j] += cr[dest];
f[j][i] -= cr[dest];
j = i;
}
flux += cr[dest];
}
void Write()
{
fout << flux << '\n';
/* for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
fout << f[i][j] << ' ';
fout << '\n';
}
fout.close(); */
}