Pagini recente » Cod sursa (job #215232) | Cod sursa (job #640738) | Cod sursa (job #71936) | Cod sursa (job #369024) | Cod sursa (job #1113623)
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
int N,M,capacitate[1010][1010],flux[1010][1010],viz[1010],TT[1010],fluxmaxim,cd[1010];
vector <int> v[1010];
void citire() {
ifstream in("maxflow.in");
int x,y,z,i;
in>>N>>M;
for(i=1;i<=M;i++) {
in>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
capacitate[x][y]+=z;
}
in.close();
}
int BF() {
int i,j,nod,vecin;
cd[0]=1;
cd[1]=1;
for(i=1;i<=N;i++)
viz[i]=0;
viz[1]=1;
for(i=1;i<=cd[0];i++) {
nod=cd[i];
if(nod==N)
continue;
for(j=0;j<v[nod].size();j++) {
vecin=v[nod][j];
if(capacitate[nod][vecin]== flux[nod][vecin] || viz[vecin])
continue;
viz[vecin]=1;
cd[0]++;
cd[cd[0]]=vecin;
TT[vecin]=nod;
}
}
return viz[N];
}
void solve() {
int i,nod,fmin;
fluxmaxim=0;
while(BF())
for(i=0;i<v[N].size();i++) {
nod=v[N][i];
if(flux[nod][N]==capacitate[nod][N] || !viz[nod])
continue;
TT[N]=nod;
fmin=11100000;
for(nod=N;nod!=1;nod=TT[nod])
fmin=min(fmin,capacitate[TT[nod]][nod]-flux[TT[nod]][nod]);
if(fmin==0)
continue;
for(nod=N;nod!=1;nod=TT[nod]) {
flux[TT[nod]][nod]+=fmin;
flux[nod][TT[nod]]-=fmin;
}
fluxmaxim+=fmin;
}
}
void afisare() {
ofstream out("maxflow.out");
out<<fluxmaxim<<'\n';
out.close();
}
int main() {
citire();
solve();
afisare();
return 0;
}