Pagini recente » Cod sursa (job #2165931) | Cod sursa (job #1714089) | Cod sursa (job #1618291) | Cod sursa (job #1396755) | Cod sursa (job #2197440)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
vector<int> v[400];
int cap[400][400];
int cost[400][400],t[400],dmin[400];
int q[130000],viz[400];
int x,y,c,z,n,m,s,d,i,j,flux,costf;
int inf = 2000000000;
int cmin = inf;
bool drum_minim(int s, int d)
{
memset(viz,0,sizeof(viz));
viz[s]=1;
int st = 1,en=1;
q[st] = s;
t[s]=-1;
dmin[s]=0;
for(int i=1; i<=n; ++i)
if(i!=s)
dmin[i]=inf;
while(st<=en)
{
int nod = q[st];
++st;
viz[nod]=0;
for(int i=0; i<v[nod].size(); ++i)
{
if(cap[nod][v[nod][i]] > 0
&& dmin[nod] + cost[nod][v[nod][i]] < dmin[v[nod][i]])
{
dmin[v[nod][i]] = dmin[nod] + cost[nod][v[nod][i]];
if(!viz[v[nod][i]])
{
++en;
q[en]=v[nod][i];
viz[v[nod][i]]=1;
}
t[v[nod][i]] = nod;
}
}
}
if(dmin[d] != inf) return 1;
return 0;
}
int main()
{
cin>>n>>m>>s>>d;
for(i=1; i<=m; ++i)
{
cin>>x>>y>>c>>z;
v[x].push_back(y);
cap[x][y]=c;
cost[x][y]=z;
v[y].push_back(x);
cap[y][x]=0;
cost[y][x]=-z;
}
int nod = d;
while(drum_minim(s,d))
{
nod = d;
cmin = inf;
while(nod != s)
{
cmin = min(cmin,cap[t[nod]][nod]);
nod = t[nod];
}
flux += cmin;
costf += dmin[d]*cmin;
nod = d;
while(nod !=s)
{
cap[nod][t[nod]] += cmin;
cap[t[nod]][nod] -= cmin;
nod = t[nod];
}
}
cout<<costf;
return 0;
}