Pagini recente » Cod sursa (job #1580425) | Cod sursa (job #2084335) | Cod sursa (job #745096) | Cod sursa (job #1056237) | Cod sursa (job #2805955)
#include <bits/stdc++.h>
#define inf 1000000000
#define nmax 1010
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m;
bool vizitat[nmax];
int c[nmax][nmax], f[nmax][nmax], pred[nmax];
vector <int> v[nmax];
void citire(){
int x, y, cap;
in >> n >> m;
for(int i = 1; i <= m; i++){
in >> x >> y >> cap;
c[x][y] += cap;
v[x].push_back(y);
v[y].push_back(x);
}
}
bool BF(){
vector <int> q;
memset(vizitat, 0, sizeof(vizitat));
q.push_back(1);
vizitat[1] = true;
for(int i = 0; i < q.size(); i++){
int nod = q[i];
if(nod == n) continue;
for(int j = 0; j < v[nod].size(); j++){
int urm = v[nod][j];
if(c[nod][urm] == f[nod][urm] || vizitat[urm]) continue;
vizitat[urm] = true;
q.push_back(urm);
pred[urm] = nod;
}
}
return vizitat[n];
}
int detFlux(){
int flux = 0, fluxMin;
while(BF())
for(int i = 0; i < v[n].size(); i++){
int nod = v[n][i];
if(!vizitat[nod] || f[nod][n] == c[nod][n]) continue;
pred[n] = nod;
fluxMin = inf;
for(nod = n; nod != 1; nod = pred[nod])
fluxMin = min(fluxMin, c[pred[nod]][nod] - f[pred[nod]][nod]);
if(fluxMin == 0) continue;
for(nod = n; nod != 1; nod = pred[nod]){
f[pred[nod]][nod] += fluxMin;
f[nod][pred[nod]] -= fluxMin;
}
flux += fluxMin;
}
return flux;
}
int main()
{
citire();
out << detFlux();
return 0;
}