Pagini recente » Cod sursa (job #91831) | Cod sursa (job #1376084) | Cod sursa (job #553345) | Cod sursa (job #75543) | Cod sursa (job #571873)
Cod sursa(job #571873)
#include<algorithm>
using namespace std;
#include<vector>
#include<queue>
#define DIM 355
#define DIMb 12345
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
vector <pair <int,int> > lst[DIM];
int vol[DIM][DIM],f[DIM][DIM],n,m,t[DIM],sol,d[DIM],s1,s2,poz;
char buff[DIMb];
inline void pars (int &nr)
{
bool smn=0;
nr=0;
while((buff[poz]<'0' || buff[poz]>'9') && buff[poz]!='-')
if(++poz==DIMb)
fread (buff,1,DIMb,stdin),poz=0;
while((buff[poz]>='0' && buff[poz]<='9') || buff[poz]=='-')
{
if(buff[poz]=='-')
smn=1;
else
nr=nr*10+buff[poz]-'0';
if(++poz==DIMb)
fread (buff,1,DIMb,stdin),poz=0;
}
if(smn==1)
nr=-nr;
}
struct cmp
{
bool operator() (const int &a, const int &b) const
{
return d[a]>d[b];
}
}; priority_queue <int, vector <int>,cmp> h;
inline void read ()
{
int i,nr1,nr2,nr3,nr4;
pars(n);
pars(m);
pars(s1);
pars(s2);
for(i=1;i<=m;++i)
{
pars(nr1);
pars(nr2);
pars(nr3);
pars(nr4);
vol[nr1][nr2]+=nr3;
lst[nr1].pb (mp(nr2,nr4));
lst[nr2].pb (mp(nr1,-nr4));
}
}
inline bool dijkstra ()
{
int i,nr;
bool v[DIM];
memset (v,0,sizeof (v));
for(i=1;i<=n;++i)
d[i]=1<<30;
v[s1]=1;
d[s1]=0;
h.push(s1);
while(!h.empty ())
{
nr=h.top ();
v[nr]=0;
h.pop ();
for(i=0;i<lst[nr].size ();++i)
if(vol[nr][lst[nr][i].fs]!=f[nr][lst[nr][i].fs] && d[nr]+lst[nr][i].sc<d[lst[nr][i].fs])
{
d[lst[nr][i].fs]=d[nr]+lst[nr][i].sc;
t[lst[nr][i].fs]=nr;
if(v[lst[nr][i].fs]==0)
{
h.push(lst[nr][i].fs);
v[lst[nr][i].fs]=1;
}
}
}
if(d[s2]==1<<30)
return 0;
return 1;
}
inline void solve ()
{
int j,minim;
while(dijkstra())
{
minim=1<<30;
for(j=s2;j!=s1;j=t[j])
minim=min(minim,vol[t[j]][j]-f[t[j]][j]);
sol+=minim*d[s2];
for(j=s2;j!=s1;j=t[j])
{
f[t[j]][j]+=minim;
f[j][t[j]]-=minim;
}
}
}
int main ()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
read ();
solve ();
printf("%d",sol);
return 0;
}