Pagini recente » Cod sursa (job #1258539) | Cod sursa (job #480117) | Cod sursa (job #961281) | Cod sursa (job #904498) | Cod sursa (job #1515837)
#include <cstring>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("fmcm.in");
ofstream out("fmcm.out");
typedef long long I64;
const int NMAX = 350;
const int MMAX = 12500;
const int CMAX = 10000;
const int INF = (1<<30);
vector <int> G[NMAX+2];
queue <int> Q;
int N, M, S, D;
int cap[NMAX+2][NMAX+2], cost[NMAX+2][NMAX+2];
int dist[NMAX+2]; bool viz[NMAX+2];
int tt[NMAX+2];
bool drum;
int BF( ) {
for( int i = 0; i <= NMAX; ++i ) {
tt[ i ] = -1;
viz[ i ] = 0;
dist[ i ] = INF;
}
while( !Q.empty() ) Q.pop();
dist[ S ] = 0;
Q.push( S );
viz[ S ] = 1;
while( !Q.empty() ) {
int nod = Q.front();
viz[nod] = 0;
Q.pop();
for( int i = 0; i < (int)G[nod].size(); ++i ) {
int x = G[nod][i];
if( cap[nod][x] > 0 && dist[nod] + cost[nod][x] < dist[x] ) {
dist[x] = dist[nod] + cost[nod][x];
tt[x] = nod;
if( viz[x] == 0 ) {
viz[x] = 1;
Q.push(x);
}
}
}
}
if( dist[ D ] != INF ) {
drum = 1;
int minv = INF;
for( int x = D; x != S; x = tt[x] ) {
minv = min( minv, cap[ tt[x] ][ x ] );
}
for( int x = D; x != S; x = tt[x] ) {
cap[ x ][ tt[x] ] += minv;
cap[ tt[x] ][ x ] -= minv;
}
return minv * dist[ D ];
}
return 0;
}
int main() {
in >> N >> M >> S >> D;
for( int i = 1; i <= M; ++i ) {
int x, y;
in >> x >> y;
in >> cap[x][y];
in >> cost[x][y];
cost[y][x] = -cost[x][y];
G[x].push_back( y );
G[y].push_back( x );
}
I64 sol = 0;
I64 floox;
drum = 1;
while( drum ) {
drum = 0;
floox = BF();
sol += floox;
}
out << sol << '\n';
return 0;
}