Pagini recente » Cod sursa (job #443637) | Cod sursa (job #590727) | Cod sursa (job #2585458) | Cod sursa (job #1110579) | Cod sursa (job #2616526)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <time.h>
const int MAXN = 1002 + 1;
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int flux[MAXN][MAXN],capacitate[MAXN][MAXN],pred[MAXN];
vector<int>graf[MAXN];
int n,m;
int main()
{
clock_t start = clock();
in>>n>>m;
for(int i = 1; i <= m; i++){
int x,y,cap;
in>>x>>y>>cap;
graf[x].emplace_back(y);
graf[y].emplace_back(x);
capacitate[x][y] = cap;
}
int ans = 0;
while(true){
for(int i = 1; i <= n; i++)
pred[i] = 0;
queue<int>coada;
coada.push(1);
bool ajuns = false;
while(!coada.empty() && !ajuns){
int nod = coada.front();
coada.pop();
for(auto const &vecin : graf[nod]){
if(!pred[vecin] && vecin != 1 && flux[nod][vecin] < capacitate[nod][vecin]){
pred[vecin] = nod;
coada.push(vecin);
if(vecin == n){
ajuns = true;
break;
}
}
}
}
if(pred[n] == 0)
break;
for(auto const &vecin : graf[n]){
if(pred[vecin]){
int minim = capacitate[vecin][n] - flux[vecin][n];
int nod = vecin;
while(pred[nod] != 0){
int inapoi = pred[nod];
minim = min(minim,capacitate[inapoi][nod] - flux[inapoi][nod]);
nod = pred[nod];
}
nod = vecin;
while(pred[nod] != 0){
int inapoi = pred[nod];
flux[inapoi][nod] += minim;
flux[nod][inapoi] -= minim;
nod = pred[nod];
}
flux[vecin][n] += minim;
flux[n][vecin] -= minim;
ans += minim;
}
}
}
out<<ans<<"\n";
//cout<<(double)(clock() - start) / CLOCKS_PER_SEC;
return 0;
}