Pagini recente » Cod sursa (job #1392977) | Cod sursa (job #379135) | Cod sursa (job #2463802) | Cod sursa (job #962197) | Cod sursa (job #2444060)
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
#define maxn 1005
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
vector <int> v[maxn];
int TT[maxn],viz[maxn],ant[maxn],f[maxn][maxn],cost[maxn][maxn],N,M,Flux,flux_minim;
void read(){
cin>>N>>M;
int x,y,c;
for(int i=1; i<=M; i++){
cin>>x>>y>>c;
v[x].push_back(y);
v[y].push_back(x);
cost[x][y]+=c;
}
}
int bfs(){
memset(viz,0,sizeof(viz));///marcheaza N elemente din viz cu valoarea 0
ant[0]=ant[1]=viz[1]=1;
int nod,dest;
for(int i=1; i<=ant[0]; i++){
nod=ant[i];
if(nod==N)
continue;
for(int i=0; i<v[nod].size(); i++){
dest=v[nod][i];
if(viz[dest] || cost[nod][dest] == f[nod][dest])
continue;
ant[++ant[0]]=dest;
TT[dest]=nod;
viz[dest]=1;
}
}
return viz[N];
}
void solve(){
int nod;
for(Flux=0; bfs();)
for(int i=0; i<v[N].size(); i++){
nod=v[N][i];
if(!viz[N] || cost[nod][N]==f[nod][N])
continue;
TT[N]=nod;
flux_minim=1000000000;
/// flux_minim=INT_MAX; maximul int (libraria climits)
for(int wh=N; wh!=1; wh=TT[wh])
flux_minim=min(flux_minim, cost[TT[wh]][wh]-f[TT[wh]][wh]);
if(flux_minim==0)
continue;
for(int wh=N; wh!=1; wh=TT[wh]){
f[TT[wh]][wh]+=flux_minim;
f[wh][TT[wh]]-=flux_minim;
}
Flux+=flux_minim;
}
cout<<Flux;
}
int main(){
read();
solve();
}