Pagini recente » Cod sursa (job #2233280) | Cod sursa (job #645481) | Cod sursa (job #2820023) | Cod sursa (job #1899243) | Cod sursa (job #2853395)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1e3 + 2, INF = 1e9;
int N, M;
vector <int> G[NMAX];
int cap[NMAX][NMAX], flux[NMAX][NMAX], T[NMAX];
bool sel[NMAX];
void reset()
{
for(int i = 1; i <= N; ++i)
sel[i] = false, T[i] = 0;
return;
}
int mymin(int a, int b)
{
return (a < b ? a : b);
}
bool BFS(int S, int D)
{
reset();
queue <int> q;
q.push(S);
sel[S] = true;
while(!q.empty()) {
int node = q.front();
q.pop();
for(auto it: G[node]) {
if(!sel[it] && cap[node][it] > flux[node][it]) {
q.push(it);
sel[it] = true;
T[it] = node;
}
}
}
return (sel[D]);
}
int maxflux(int S, int D)
{
int ans = 0, node, Fmax;
while(BFS(S, D)) {
for(auto it: G[D]) {
Fmax = INF;
if(sel[it]) {
node = it;
Fmax = mymin(Fmax, cap[it][D] - flux[it][D]);
while(node != S) {
Fmax = mymin(Fmax, cap[T[node]][node] - flux[T[node]][node]);
node = T[node];
}
node = it;
flux[it][D] += Fmax;
flux[D][it] -= Fmax;
while(node != S) {
flux[T[node]][node] += Fmax;
flux[node][T[node]] -= Fmax;
node = T[node];
}
ans += Fmax;
}
}
}
return ans;
}
int main()
{
fin >> N >> M;
int a, b, c;
for(int i = 1; i <= M; ++i) {
fin >> a >> b >> c;
G[a].push_back(b);
G[b].push_back(a);
cap[a][b] = c;
}
fout << maxflux(1, N) << '\n';
return 0;
}