Pagini recente » Monitorul de evaluare | Cod sursa (job #1285848) | Cod sursa (job #44) | Cod sursa (job #13048) | Cod sursa (job #303571)
Cod sursa(job #303571)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <deque>
#define nm 1010
#define INF 0x3f3f3f3f
using namespace std;
deque <int> q;
vector <int> v[nm];
int i, n, m, x, y, c;
int R[nm][nm];
int viz[nm];
int from[nm];
inline int mn (int a, int b) { return ( a < b ? a : b); }
int bfs()
{
q.clear();
q.push_back(1);
viz[1] = 1;
for (int i=2; i<=n; ++i)
{
viz[i] = 0;
from[i] = -1;
}
from[1] = -1;
int p, p_c, prev, done = 0;;
while (q.size() > 0 && !done)
{
p = q.front();
for (vector <int>::iterator it = v[p].begin(); it != v[p].end() && !done; ++it)
{
if (viz[*it] == 0 && R[p][*it] > 0)
{
q.push_back(*it);
viz[*it] = 1;
from[*it] = p;
if (*it == n)
{
// it = v[p].end();
done = 1;
// q.clear();
}
}
}
q.pop_front();
}
p = n;
p_c = INF;
while (from[p] > -1)
{
prev = from[p];
p_c = mn(p_c, R[prev][p]);
p = prev;
}
p = n;
while (from[p] > -1)
{
prev = from[p];
R[prev][p] -= p_c;
R[p][prev] += p_c;
p = prev;
}
if (p_c < INF)
return p_c;
return 0;
}
int max_flow()
{
int sol = 0, pc;
while (true)
{
pc = bfs();
if (pc != 0)
sol += pc;
else
return sol;
}
return sol;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d ", &n, &m);
for (i=1; i<=m; ++i)
{
scanf("%d %d %d ", &x, &y, &c);
v[x].push_back(y);
v[y].push_back(x);
//F[x][y] = c;
R[x][y] += c;
//R[y][x] = 0;
}
printf("%d\n", max_flow());
return 0;
}