Pagini recente » Cod sursa (job #685285) | Cod sursa (job #2913829) | Cod sursa (job #839977) | Cod sursa (job #366460) | Cod sursa (job #1350932)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int nmax = int(1e3) + 2, inf = int(2e9);
int N, M;
int F[nmax][nmax];
int cap[nmax][nmax];
int T[nmax];
vector<int> G[nmax];
bool visited[nmax];
int Q[nmax];
void readData() {
scanf("%d %d", &N, &M);
int a, b, c;
for (int i = 0; i < M; i++) {
scanf("%d %d %d", &a, &b, &c);
cap[a][b] += c;
G[a].push_back(b);
G[b].push_back(a);
}
}
inline bool bfs(const int &source, const int &sink) {
int L, R;
L = R = 0;
memset(visited, 0, sizeof(visited));
T[source] = source;
visited[source] = true;
Q[R++] = source;
while (L < R) {
int v = Q[L++];
if (v == sink) continue;
for (const int &w : G[v]) {
if (!visited[w] && F[v][w] < cap[v][w]) {
visited[w] = true;
T[w] = v;
Q[R++] = w;
}
}
}
return visited[sink];
}
int getFlow(const int &source, const int &sink) {
int ret = 0;
while (bfs(source, sink)) {
for (const int &v : G[sink]) {
if (!visited[v] || cap[v][sink] == F[v][sink]) continue;
T[sink] = v;
int fmax = inf;
for (int w = sink; w != source; w = T[w]) {
fmax = min(fmax, cap[T[w]][w] - F[T[w]][w]);
}
if (!fmax) continue;
ret += fmax;
for (int w = sink; w != source; w = T[w]) {
F[T[w]][w] += fmax;
F[w][T[w]] -= fmax;
}
}
}
return ret;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
readData();
printf("%d\n", getFlow(1, N));
return 0;
}