Pagini recente » Cod sursa (job #2937293) | Cod sursa (job #37902) | Cod sursa (job #1903395) | Cod sursa (job #2691665) | Cod sursa (job #2066077)
# include <iostream>
# include <fstream>
# include <vector>
using namespace std;
const int MAX_N = 350;
const int INF = 2e9;
int flow[1 + MAX_N][1 + MAX_N];
int cost[1 + MAX_N][1 + MAX_N];
int dist[1 + MAX_N], from[1 + MAX_N];
vector<int> edges[1 + MAX_N];
int Q[MAX_N * MAX_N], L;
int main() {
ifstream fin( "fmcm.in" );
ofstream fout( "fmcm.out" );
int n, m, S, D;
fin >> n >> m >> S >> D;
for ( int i = 0; i < m; i ++ ) {
int u, v, c, z;
fin >> u >> v >> c >> z;
flow[u][v] = c;
cost[u][v] = z;
cost[v][u] = -z;
edges[u].push_back( v );
edges[v].push_back( u );
}
bool improve = true;
int f = 0, c = 0;
do {
for ( int i = 1; i <= n; i ++ )
dist[i] = INF;
dist[S] = 0;
L = 1;
Q[0] = S;
for ( int i = 0; i < L; i ++ ) {
int u = Q[i];
for ( int v : edges[u] )
if ( flow[u][v] && dist[u] + cost[u][v] < dist[v] ) {
dist[v] = dist[u] + cost[u][v];
from[v] = u;
Q[L ++] = v;
}
}
if ( dist[D] != INF ) {
int mflow = INF;
for ( int i = D; i != S; i = from[i] )
mflow = min( mflow, flow[from[i]][i] );
for ( int i = D; i != S; i = from[i] ) {
flow[from[i]][i] -= mflow;
flow[i][from[i]] += mflow;
}
f += mflow;
c += dist[D] * mflow;
} else
improve = false;
} while ( improve );
fout << c;
return 0;
}