Pagini recente » Cod sursa (job #3282342) | Cod sursa (job #2652546) | Cod sursa (job #2532021) | Cod sursa (job #2984972) | Cod sursa (job #1887473)
#include <bits/stdc++.h>
FILE *fin = freopen("maxflow.in", "r", stdin);
FILE *fout = freopen("maxflow.out", "w", stdout);
using namespace std;
const int MAX_N = 1000;
vector <int> vecini[1 + MAX_N];
int r[1 + MAX_N][1 + MAX_N];
int deUnde[1 + MAX_N];
vector <int> inD;
queue <int> Q;
bool bfs(int S, int D)
{
memset(deUnde, 0, sizeof(deUnde));
Q.push(S);
deUnde[S] = S;
while(!Q.empty())
{
int node = Q.front();
Q.pop();
for(int son : vecini[node])
{
if(!r[node][son] || deUnde[son]) continue;
if(son != D)
Q.push(son);
deUnde[son] = node;
}
}
return deUnde[D] != 0;
}
int main()
{
int N, M, u, v, capacity;
scanf("%d %d", &N, &M);
for (int i = 0; i < M; i++){
scanf("%d %d %d", &u, &v, &capacity);
vecini[u].push_back(v);
vecini[v].push_back(u);
r[u][v] = capacity;
}
int S = 1, D = N, flux = 0;
for(int u = 1; u <= N; u++) {
if (r[u][D] > 0)
inD.push_back(u);
}
while(bfs(S, D)) {
for(int v : inD) {
if (deUnde[v] != 0) {
deUnde[D] = v;
int fDrum = 0x7fffffff;
int u = D;
while(u != S) {
if (fDrum > r[deUnde[u]][u]) {
fDrum = r[deUnde[u]][u];
}
u = deUnde[u];
}
u = D;
while(u != S) {
r[deUnde[u]][u] -= fDrum;
r[u][deUnde[u]] += fDrum;
u = deUnde[u];
}
flux += fDrum;
}
}
}
printf("%d\n", flux);
return 0;
}