Pagini recente » Cod sursa (job #1948274) | Cod sursa (job #1273343) | Cod sursa (job #2625006) | Cod sursa (job #1278565) | Cod sursa (job #616311)
Cod sursa(job #616311)
#include <queue>
#include <vector>
#include <fstream>
#include <cstdlib>
#define N_MAX 361
#define oo 1<<29
#define pr pair< int, int >
using namespace std;
int N, source, sink;
bool was[N_MAX];
int d[N_MAX], f[N_MAX];
int C[N_MAX][N_MAX], F[N_MAX][N_MAX];
vector< pr > G[N_MAX];
vector< pr >::const_iterator it, iend;
class cmp
{
public : bool operator() (const int& x, const int& y) const { return d[x] > d[y]; }
};
priority_queue< int, vector<int>, cmp > pQ;
inline int _min( int x, int y ) { return x <= y ? x : y; }
bool findPath()
{
int x, i;
for( i=1; i <= N; ++i )
d[i]=oo, f[i]=-1;
f[source]=-2;
d[source]=0;
for( pQ.push(source); !pQ.empty(); )
{
x=pQ.top(); pQ.pop();
was[x]=false;
for( it=G[x].begin(), iend=G[x].end(); it < iend; ++it )
{
if( source == it->first )
continue;
if( d[it->first] > d[x]+it->second && C[x][it->first] > F[x][it->first] )
{
f[it->first]=x;
d[it->first]=d[x]+it->second;
if( false == was[it->first] )
{
pQ.push( it->first );
was[it->first]=true;
}
}
}
}
return -1 != f[sink];
}
int main( void )
{
int M, x, y, c, dis, s;
ifstream in( "fmcm.in" );
for( in>>N>>M>>source>>sink; M; --M )
{
in>>x>>y>>c>>dis;
G[x].push_back( pr( y, dis ) );
G[y].push_back( pr( x, -dis ) );
C[x][y]=c;
}
for( s=0; findPath(); s+=c*d[sink] )
{
c=oo;
for( x=sink; -2 != f[x]; x=f[x] )
c=_min( c, C[f[x]][x]-F[f[x]][x] );
for( x=sink; -2 != f[x]; x=f[x] )
F[f[x]][x]+=c, F[x][f[x]]-=c;
}
ofstream out( "fmcm.out" );
out<<s<<'\n';
return EXIT_SUCCESS;
}