Pagini recente » Cod sursa (job #1771743) | Cod sursa (job #905076) | Cod sursa (job #1930863) | Cod sursa (job #253085) | Cod sursa (job #282784)
Cod sursa(job #282784)
#include <fstream>
#include <list>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 360
#define fc(x,y) (C[x][y]-F[x][y])
typedef list<int> li;
ifstream in( "fmcm.in" );
ofstream out( "fmcm.out" );
int N,M,S,D;
int C[MAX][MAX], Cst[MAX][MAX], F[MAX][MAX];
li G[MAX];
int i, r, rc, f, c;
int T[MAX], Dist[MAX], U[MAX];
int Bellman() {
memset( T, 0, sizeof(T) );
memset( Dist, 0x3f, sizeof(Dist) );
memset( U, 0, sizeof(U) );
li Q;
Q.push_back( S );
Dist[S] = 0;
while ( !Q.empty() ) {
int x = Q.front(); Q.pop_front();
U[x] ++;
if ( U[x] == N ) return 0x3f3f3f3f;
for ( li::iterator i=G[x].begin(); i!=G[x].end(); ++i ) {
if ( fc(x,*i) > 0 && Dist[*i] > Dist[x]+Cst[x][*i] )
Dist[*i] = Dist[x]+Cst[x][*i], Q.push_back(*i), T[*i] = x;
}
}
return Dist[D];
for ( i=1; i<=N; ++i )
cerr << Dist[i] << " ";
cerr << "\n";
return Dist[D];
}
int main() {
// load
in >> N >> M >> S >> D;
while ( M-- ) {
int x, y ,capac, cost;
in >> x >> y >> capac >> cost;
C[x][y] = capac;
Cst[x][y] = cost;
Cst[y][x] = -cost;
G[x].push_back(y);
G[y].push_back(x);
}
// do_flux, please...
for ( f=c=0; (rc=Bellman())!=0x3f3f3f3f; f+=r, c+=r*rc) {
r = 0x3f3f3f3f;
for ( i=D; i!=S; i=T[i] )
r = min(r, fc(T[i],i));
for ( i=D; i!=S; i=T[i] )
F[T[i]][i] += r, F[i][T[i]] -= r;
}
// afis
out << c << "\n";
return 0;
}