Pagini recente » Cod sursa (job #2357520) | Cod sursa (job #159763) | Cod sursa (job #2371521) | Cod sursa (job #1499) | Cod sursa (job #1165493)
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define FILEIN "maxflow.in"
#define FILEOUT "maxflow.out"
#define NMAX 1005
int C[NMAX][NMAX], F[NMAX][NMAX], T[NMAX], N, M;
bool Used[NMAX];
vector<int> A[NMAX];
queue<int> BFQ;
int AugPath(int node, int sink) {
int flow = 0x3f3f3f3f;
T[sink] = node;
for ( int x = sink; x != 1; x = T[x]) {
flow = min(flow, C[T[x]][x] - F[T[x]][x]);
}
if (flow == 0)
return 0;
for ( int x = sink; x != 1; x = T[x]) {
F[T[x]][x] += flow;
F[x][T[x]] -= flow;
}
return flow;
}
bool BFTree(int source, int sink) {
memset(Used, 0, sizeof(Used));
BFQ.push(source);
Used[source] = 1;
while(!BFQ.empty()) {
int x = BFQ.front();
BFQ.pop();
if (x == sink)
continue;
for ( int i = 0; i < A[x].size(); i++ ) {
int y = A[x][i];
if (F[x][y] == C[x][y])
continue;
if (Used[y])
continue;
Used[y] = 1;
BFQ.push(y);
T[y] = x;
}
}
return Used[sink];
}
int Flux(int source, int sink) {
int flow = 0;
while(BFTree(source, sink)) {
for ( int i = 0; i < A[sink].size(); i++ ) {
flow += AugPath(A[sink][i], sink);
}
}
return flow;
}
int main() {
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d %d", &N, &M);
for ( int i = 1, x, y; i <= M; i++ ) {
scanf("%d %d", &x, &y);
scanf("%d", &C[x][y]);
A[x].push_back(y);
A[y].push_back(x);
}
printf("%d\n", Flux(1, N));
return 0;
}