Pagini recente » Cod sursa (job #15187) | Cod sursa (job #286088)
Cod sursa(job #286088)
using namespace std;
#include <cstdio>
#include <list>
#include <algorithm>
#define Nmax 1010
list <int> L[Nmax];
int C[Nmax][Nmax], F[Nmax][Nmax], c[Nmax], t[Nmax];
int n, m, i, maxflow;
void citire(){
int i, x, y, z;
FILE *f = fopen("maxflow.in", "r");
fscanf(f,"%d %d",&n,&m);
for(i=1; i <= m; i++){
fscanf(f,"%d %d %d",&x, &y, &z);
L[x].push_back(y);
L[y].push_back(x);
C[x][y] = z; // C[y][x] = 0;
}
fclose(f);
}
int BF(){
int p = 1, u = 1, ok = 0, fiu, nod;
list <int>::iterator it;
memset(t, 0, sizeof(t));
c[1] = 1; t[1] = 0;
for(p = 1; p <= u; p++){
nod = c[p];
for(it = L[nod].begin(); it != L[nod].end(); it++){
fiu = *it;
if( F[nod][fiu] < C[nod][fiu] && !t[fiu]){
if( fiu == n ) {ok = 1; continue;}
u++;
c[u] = fiu;
t[fiu] = nod;
}
}
}
return ok;
}
void solve(){
list <int>::iterator it; int T, Min, fiu;
while( BF() ){
for(it = L[n].begin(); it !=L[n].end(); it++){
fiu = *it;
if( t[fiu] ){
Min = C[fiu][n] - F[fiu][n];
for(T = fiu; T != 1 ; T = t[T])
Min = min(Min, C[ t[T] ][ T ] - F[ t[T] ][ T ]);
F[fiu][ n ]+= Min;
F[ n ][fiu]-= Min;
for(T = fiu; T != 1 ; T = t[T]){
F[t[T]][ T ]+= Min;
F[ T ][t[T]]-= Min;
}
maxflow+=Min;
}
}
}
}
void afisare(){
FILE *g = fopen("maxflow.out", "w");
fprintf(g,"%d",maxflow);
fclose(g);
}
int main(){
citire();
solve();
afisare();
return 0;
}