Pagini recente » Cod sursa (job #1720708) | Cod sursa (job #638317) | Cod sursa (job #763011) | Cod sursa (job #2801392) | Cod sursa (job #637808)
Cod sursa(job #637808)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define N 1003
vector <int> a[N];
int n, m;
int cap[N][N];
bool use[N];
int t[N];
int source, sink;
int bfs () {
memset (t, -1, sizeof (t));
memset (use, 0, sizeof (use));
int Q[N], p = 0, q = 0;
Q[0] = source;
use[source] = 1;
while (p <= q) {
int u = Q[p++];
for (vector <int>::iterator i = a[u].begin (); i != a[u].end (); ++i)
if (!use[*i] && cap[u][*i] > 0) {
t[*i] = u;
Q[++q] = *i;
use[*i] = 1;
}
}
if (t[sink] != -1)
return 1;
return 0;
}
void max_flow () {
int flow = 0, i;
while (bfs ()) {
for (i = 1; i < sink; ++i)
if (t[i] && cap[i][sink] > 0) {
int mn = 0x3f3f3f3f, j;
mn = min (mn, cap[i][sink]);
for (j = i; t[j] != -1; j = t[j]) {
mn = min (mn, cap[t[j]][j]);
}
if (mn < 0) continue;
cap[i][sink] -= mn;
for (j = i; t[j] != -1; j = t[j])
cap[ t[j] ][j] -= mn,
cap[j][ t[j] ] += mn;
flow += mn;
}
}
printf ("%d\n", flow);
}
int main () {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
scanf ("%d %d\n", &n, &m);
source = 1; sink = n;
int p, q, c;
while (m--) {
scanf ("%d %d %d\n", &p, &q, &c);
cap[p][q] += c;
a[p].push_back (q);
a[q].push_back (p);
}
max_flow ();
}