Pagini recente » Cod sursa (job #929802) | Cod sursa (job #2611954) | Cod sursa (job #2334309) | Cod sursa (job #2759346) | Cod sursa (job #2071993)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int INF = 0x3f3f3f3f;
int n, m, s, d, f[355], costFlux, minim;
int Cst[355][355], F[355][355], C[355][355];
int old_Dist[355], D[355], real_Dist[355], T[355];
vector<int> v[355];
queue<int> Dq;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > q;
bool bfs(){
memset( D, INF, sizeof( D ) );
memset( real_Dist, INF, sizeof( real_Dist ) );
memset( T, 0, sizeof(T) );
D[s] = 0; real_Dist[s] = 0;
q.push( make_pair( D[s], s ) );
while( !q.empty() ){
int nod = q.top().second;
int dist = q.top().first;
q.pop();
if( dist != D[nod] )
continue;
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];
if( C[nod][vecin] > F[nod][vecin] && D[vecin] > D[nod] + Cst[nod][vecin] + old_Dist[nod] - old_Dist[vecin] ){
D[vecin] = D[nod] + Cst[nod][vecin] + old_Dist[nod] - old_Dist[vecin];
real_Dist[vecin] = real_Dist[nod] + Cst[nod][vecin];
T[vecin] = nod;
q.push( make_pair( D[vecin], vecin ) );
}
}
}
memcpy( old_Dist, real_Dist, sizeof(real_Dist) );
if( D[d] == INF )
return false;
return true;
}
int main(){
fin >> n >> m >> s >> d;
for( int i = 1; i <= m; i++ ){
int a, b, c, z;
fin >> a >> b >> c >> z;
C[a][b] = c;
Cst[a][b] = z; Cst[b][a] = -z;
v[a].push_back( b );
v[b].push_back( a );
}
memset( old_Dist, INF, sizeof(old_Dist) );
Dq.push( s ); old_Dist[s] = 0; f[s] = 1;
while( !Dq.empty() ){
int nod = Dq.front();
for( int i = 0; i < v[nod].size(); i++ ){
int vecin = v[nod][i];
if( C[nod][vecin] > F[nod][vecin] && old_Dist[vecin] > old_Dist[nod] + Cst[nod][vecin] ){
old_Dist[vecin] = old_Dist[nod] + Cst[nod][vecin];
if( f[vecin] == 0 ){
f[vecin] = 1;
Dq.push( vecin );
}
}
}
f[nod] = 0;
Dq.pop();
}
while( bfs() == true ){
minim = INF;
for( int nod = d; nod != s; nod = T[nod] )
minim = min( minim, C[ T[nod] ][nod] - F[ T[nod] ][nod] );
costFlux += minim * real_Dist[d];
for( int nod = d; nod != s; nod = T[nod] ){
F[ T[nod] ][nod] += minim;
F[nod][ T[nod] ] -= minim;
}
}
fout << costFlux << "\n";
return 0;
}