Pagini recente » Cod sursa (job #2730148) | Cod sursa (job #18192) | Cod sursa (job #60666) | Cod sursa (job #290259) | Cod sursa (job #283302)
Cod sursa(job #283302)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
#define NUME "maxflow"
ifstream fi(NUME".in");
ofstream fo(NUME".out");
#define MAXN 1001
#define INF 0x3f3f3f3f
int N, M, S, D;
struct list { int nod; list *r; } *L[MAXN];
int F[MAXN][MAXN], C[MAXN][MAXN];
int T[MAXN], U[MAXN];
#define avail(i, j) (C[i][j] - F[i][j])
int BF(int S, int D)
{
int x;
memset(U, 0, sizeof(U));
queue<int> Q;
Q.push(S); U[S] = 1;
while (!Q.empty()) {
x = Q.front(); Q.pop();
for (list *p = L[x]; p; p = p->r) {
if (avail(x, p->nod) > 0 && !U[p->nod]) {
T[p->nod] = x;
U[p->nod] = 1;
Q.push(p->nod);
}
}
}
return x == D;
}
void push(int x, int y) {
list *p = new list;
*p = (list) { y, L[x] };
L[x] = p;
}
void fluxul(int S, int D)
{
int f, r, i;
for (f = 0; BF(S, D); ) {
for (list *p = L[D]; p; p = p->r) {
r = C[p->nod][D];
for (i = p->nod; i != S; i = T[i])
r = min(r, avail(T[i], i));
for (i = p->nod; i != S; i = T[i])
F[ T[i] ][i] += r, F[i][ T[i] ] -= r;
f += r;
}
}
fo << f << "\n";
}
void citirea()
{
fi >> N >> M;
S = 1; D = N;
while (M--) {
int x, y, c;
fi >> x >> y >> c;
push(x, y);
push(y, x);
C[x][y] = c;
}
}
int main()
{
citirea();
fluxul(S, D);
return 0;
}