Pagini recente » Cod sursa (job #657123) | Cod sursa (job #2945405) | Cod sursa (job #74326) | Cod sursa (job #1738929) | Cod sursa (job #1818676)
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
void solve_flux();
int ask();
void update(int k);
bool bfs();
int S, D;
int adia[1100][1100];
int flux;
int tata[1100];
int main()
{
ifstream in("maxflow.in");
int n, m;
in >> n >> m;
S = 1, D = n;
int a, b, c;
while (m--) {
in >> a >> b >> c;
adia[a][b] += c;
}
solve_flux();
ofstream out("maxflow.out");
out << flux;
return 0;
}
bool bfs()
{
memset(tata, 0, sizeof tata);
queue <int> q;
q.push(S);
tata[S] = -1;
while (!q.empty()) {
int n = q.front();
q.pop();
for (int i(1); i <= D; i++) {
if (adia[n][i] && !tata[i]) {
tata[i] = n, q.push(i);
if (i == D)
return true;
}
}
}
return false;
}
void update(int k)
{
flux += k;
for (int i(D); i != S; i = tata[i])
adia[tata[i]][i] -= k, adia[i][tata[i]] += k;
}
int ask()
{
int minim(1e9);
for (int i(D); i != S; i = tata[i])
minim = min(minim, adia[tata[i]][i]);
return minim;
}
void solve_flux()
{
while (bfs())
update(ask());
}