Pagini recente » Cod sursa (job #1596445) | Cod sursa (job #2130090) | Cod sursa (job #218629) | Cod sursa (job #2552279) | Cod sursa (job #799543)
Cod sursa(job #799543)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define MAXN 1002
#define INF 200000
int n, m;
vector<int> G[MAXN];
int cap[MAXN][MAXN];
int viz[MAXN], from[MAXN];
int source = 1, dest;
int max_flow();
int find_path();
void read();
int max_flow()
{
int flow = 0;
while (true) {
int path = find_path();
if (path == 0)
break;
flow += path;
}
return flow;
}
int find_path()
{
queue<int> q;
memset(viz, 0, sizeof(viz));
memset(from, -1, sizeof(from));
q.push(1);
viz[1] = 1;
bool flag = true;
while (!q.empty() && flag) {
int where = q.front(); q.pop();
for (size_t i = 0; i < G[where].size() && flag; ++i) {
int next = G[where][i];
if (!viz[next] && cap[where][next] > 0) {
viz[next] = 1;
from[next] = where;
q.push(next);
if (next == dest)
flag = false;
}
}
}
int where = dest, path_cap = INF;
while (from[where] > -1) {
int prev = from[where];
path_cap = min(path_cap, cap[prev][where]);
where = prev;
}
where = dest;
while (from[where] > -1) {
int prev = from[where];
cap[prev][where] -= path_cap;
cap[where][prev] += path_cap;
where = prev;
}
if (path_cap == INF)
return 0;
return path_cap;
}
void read()
{
FILE *fin = fopen("maxflow.in", "r");
fscanf(fin, "%d %d", &n, &m);
dest = n;
for (int i = 0; i < m; ++i) {
int x, y, cost;
fscanf(fin, "%d %d %d", &x, &y, &cost);
G[x].push_back(y);
cap[x][y] = cost;
cap[y][x] = -cost;
}
fclose(fin);
}
int main()
{
read();
FILE *fout = fopen("maxflow.out", "w");
fprintf(fout, "%d\n", max_flow());
fclose(fout);
return 0;
}